Define an interface for creating an object, but let subclass decide which class to instantiate, Factory Method lets a class defer instantiation to subclass.

定义一个创建对象的接口,让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到子类。

工厂方法模式的有点

  • 良好的封装性,代码结构清晰,一个调用者只要知道要创建对象的名字,不需要知道对象的具体的创建过程,降低模块间的耦合
  • 工厂方法模式的扩展性非常优秀。当要增加产品的时候只要修改具体的共产类,或者扩展一个工厂类
  • 屏蔽产品类。产品类如何实现和变化的,调用者不需要去关心,只需要关心产品的接口,只要接口不变,系统中上层模块就不需要发生变化。
  • 工厂方法模式是典型的解耦框架。高层模块只需要知道产品的抽象类,其他实现类都不需要关心

通用工厂模式

UML

image

简单工厂模式

有时候一个模块只需要一个工厂没有必要把他实例化出来,使用静态方法就可以了。

UML

image

多个工厂类的工厂模式

在项目比较复杂的时候,有时候我们创造很多个对象,每个对象创建又很很繁琐,比如要设置各种初始值。如过我们把这些对象的创建放在一个方法中,就会使代码比较臃肿,结构不够清晰。

考虑到需要结构清晰,我们就为每个产品定义一个创造者

UML

image

代码

download