一、模式动机
简单工厂模式如果需要增加新类型,那么需要修改工厂类的代码,这就使得整个设计在一定程度上违反了“开放封闭原则”。我们定义一个抽象的工厂类,而定义具体的工厂类来实现这个抽象按钮工厂类中定义的方法。抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品。这一特点使得工厂方法模式具有超越简单工厂模式的优越性。
二、模式定义
工厂方法模式(Factory Method Pattern):工厂方法模式又简称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态模式,属于类的创建型模式。在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建) 哪一个类。
三、模式结构
四、参与者
- Product:抽象产品
- ConcreteProduct:具体产品
- Factory:抽象工厂
- ConcreteFactory:具体工厂
五、示例代码
package design.pattern;
abstract class Factory {
public abstract MobilePhone createPhone();
}
class AppleFactory extends Factory {
public MobilePhone createPhone() {
return new Iphone4S();
}
}
class SamSungFactory extends Factory {
public MobilePhone createPhone() {
return new GalaxyNote2();
}
}
class HTCFactory extends Factory {
public MobilePhone createPhone() {
return new HTCOneM7();
}
}
public class FactoryMethod {
public static void main(String[] args) {
Factory f = new HTCFactory();
MobilePhone p = f.createPhone();
p.call();
p.sendMsg();
}
}
模式结构
优点
- 工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类被实例化这一细节
- 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键
- 在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,而只要添加一个新的具体工厂和具体产品即可
缺点
- 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,类成对增加,将导致系统设计较为庞大,且运行时系统会有额外的开销。
- 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现的时候可能需要用到反射等技术,增加了系统的实现难度。
模式使用
- 不能清楚知道所必须创建的对象的类
- 一个类希望由它的子类来指定它所创建的对象
- 将创建对象的职责委托给多个子类中的某一个,且不同子类提供不同实现