设计模式-工厂方法模式(Factory Method Pattern)
设计模式-工厂方法模式(Factory Method Pattern)
概要
记忆关键词:子类决定实例化
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
分析:
工厂方法模式结构图如下:
一、能解决什么问题?
二、涉及的角色
1. 抽象接口
统一的抽象类,代码示例:
1 public interface Phone { 4 void make(); 7 }
2. 具体实现类
实现接口的具体功能实现类,代码示例:
1 public class Iphone implements Phone{ 2 public Iphone() { 3 this.make(); 4 } 5 6 @Override 7 public void make() { 8 // TODO Auto-generated method stub 9 System.out.println("make iphone!"); 10 } 11 } 12 13 14 public class MiPhone implements Phone{ 15 public MiPhone() { 16 this.make(); 17 } 18 19 @Override 20 public void make() { 21 // TODO Auto-generated method stub 22 System.out.println("make xiaomi phone!"); 23 } 24 }
3. 工厂类接口
1 public interface AbstractFactory { 5 Phone makePhone(); 9 }
4. 工厂类子类
1 public class AppleFactory implements AbstractFactory{ 2 @Override 3 public Phone makePhone() { 4 return new Iphone(); 5 } 6 } 7 8 9 public class XiaoMiFactory implements AbstractFactory{ 10 @Override 11 public Phone makePhone() { 12 return new MiPhone(); 13 } 14 }
客户端类:
1 public static void main(String[] args) { 2 AbstractFactory miFactory = new XiaoMiFactory(); 3 AbstractFactory appleFactory = new AppleFactory(); 4 miFactory.makePhone(); // make xiaomi phone! 5 appleFactory.makePhone(); // make iphone! 6 }
三、优缺点分析
1. 优点
工厂方法克服了简单工厂违背了开放-封闭原则的缺点,又保持了封装对象创建过程的优点
集中封装了对象的创建,使得更换对象时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合
2. 缺点
每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量
四、工厂方法模式和简单工厂模式的区别
以计算器为例,先通过两者的UML类图看下区别
简单工厂UML结构图:
工厂方法UML结构图:
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
工厂方法模式中,每一个子类对对应一个工厂子类,利用多态特性动态创建对象。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来生成实例,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。
如果要添加功能,本来是要改工厂类的,而现在是修改客户端。
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。
五、客户端选择判断的问题
利用反射可以避免客户端分支判断的问题