开闭原则:一个软件实体应该对扩展开放,对修改关闭,也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现 在不修改源代码的情况下改变这个模块的行为。
创建型模式:将对象的 创建过程 和 使用过程分离,降低耦合,使得软件系统易于扩展。
简单工厂模式属于创建型模式。
通过一个例子(权限管理)理解简单工厂模式
1.客户端有很多人可以登录,身份不同,有员工、经理和管理者。这三者权限不同,但都是客户。所以先创建一个抽象类客户User,再让三个具体类去继承。
2.员工、经理和管理者称为具体类Employee、Manager、Administrator,有各自的方法。
3.客户端里实现主函数main,对象的创建必然是在主函数里。
4.不直接创建对象,通过工厂类UserFactory创建,返回的User对象。具体返回是创建三种具体类对象。
5.实际开发过程中,会有DAO层,获取账号密码,再通过数据库判断是什么账号,返回员工、经理或管理者的标志,再通过标志传入工厂类获取对象。

1 package 简单工厂模式;
2
3 public class Client {
4
5 public static void main(String[] args) {
6 try {
7 User user;
8 UserDAO userdao=new UserDAO();
9 int permisson=userdao.findPermission("zhangsan", "123456");
10 user=UserFactory.getUser(permisson);//客户端只传入参数,通过工厂创建,不管对象如何创建
11 user.sameOperation();
12 user.diffOperation();
13 }catch(Exception e) {
14 System.out.println(e.getMessage());
15 }
16 }
17 }
18
19 abstract class User{
20 public void sameOperation() {
21 System.out.println("修改个人资料");
22 }
23 public abstract void diffOperation();
24 }
25
26 class Employee extends User{
27 public Employee() {
28 System.out.println("创建员工对象");
29 }
30 public void diffOperation() {
31 System.out.println("员工拥有创建假条权限");
32 }
33 }
34 class Manager extends User{
35 public Manager() {
36 System.out.println("创建经理对象");
37 }
38 public void diffOperation() {
39 System.out.println("经理拥有创建和审批假条权限");
40 }
41 }
42 class Administrator extends User{
43 public Administrator() {
44 System.out.println("创建管理员对象");
45 }
46 public void diffOperation() {
47 System.out.println("经理拥有创建和管理假条权限");
48 }
49 }
50
51 class UserFactory {//工厂类,根据逻辑条件返回对象,负责创建对象,这样对象不是在主函数里创建的
52 public static User getUser(int permisson) {
53 if(permisson==0)
54 return new Employee();
55 else if(1==permisson)
56 return new Manager();
57 else if(permisson==2)
58 return new Administrator();
59 else
60 return null;
61 }
62 }//适用于创建对象较少,这样逻辑结构不会太过复杂
63 //缺点:每加一个产品类,就要修改工厂类,加入必要的逻辑处理,违背了“开闭原则”,通过工厂方法模式改进
64
65
66 class UserDAO {//用户表数据访问类(模拟)UserDAO
67 public int findPermission(String name,String password) {
68 if(name=="zhangsan"&&password=="123456")
69 return 0;
70 else
71 return -1;
72 }
73 }
输出:
创建员工对象
修改个人资料
员工拥有创建假条权限
简言之,将创建对象交给工厂去类去实现,创建对象和使用对象分隔开。(感觉设计模式只是一种编码技巧,各种名字起得天花乱坠)
缺点:每加一个产品类,就要修改工厂类,加入必要的逻辑处理,需要修改源码,违背了“开闭原则”,通过工厂方法模式改进。
