开闭原则:一个软件实体应该对扩展开放,对修改关闭,也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现 在不修改源代码的情况下改变这个模块的行为。
创建型模式:将对象的 创建过程 和 使用过程分离,降低耦合,使得软件系统易于扩展。
简单工厂模式属于创建型模式。
通过一个例子(权限管理)理解简单工厂模式
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 }
输出:
创建员工对象
修改个人资料
员工拥有创建假条权限
简言之,将创建对象交给工厂去类去实现,创建对象和使用对象分隔开。(感觉设计模式只是一种编码技巧,各种名字起得天花乱坠)
缺点:每加一个产品类,就要修改工厂类,加入必要的逻辑处理,需要修改源码,违背了“开闭原则”,通过工厂方法模式改进。