工厂方法模式

Catalogue   

定义

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

结构图

角色

  • 抽象工厂:实现了所有操纵产品的方法,但不实现工厂方法。factoryMethod是抽象方法。
  • 具体工厂:必须实现抽象的抽象方法,以实际制造出产品。
  • 抽象产品:所有产品的抽象。
  • 具体产品:不同的具体产品。

优缺点

优点:

  • 符合开闭原则,具有很强的的扩展性、弹性和可维护性。扩展时只要添加一个ConcreteCreator,而无须修改原有的ConcreteCreator,因此维护性也好。解决了简单工厂对修改开放的问题。
  • 使用了依赖倒置原则,依赖抽象而不是具体,使用(客户)和实现(具体类)松耦合。
  • 客户只需要知道所需产品的具体工厂,而无须知道具体工厂的创建产品的过程,甚至不需要知道具体产品的类名。

缺点:

  • 代码量增加

设计原则

依赖倒置原则:要依赖抽象,不要依赖具体类。

我们写代码的时候应该尽量达到以下原则:

  • 变量不可以持有具体类的引用
  • 不要让类派生自具体类
  • 不要覆盖基类中已实现的方法

使用场景

  • 当需要一个对象时,我们不需要知道该对象所对应的具体类,只要知道哪个具体工厂可以生成该对象,实例化这个具体工厂即可创建该对象。
  • 类的数目不固定,随时有新的子类增加进来,或者是还不知道将来需要实例化哪些具体类。
  • 定义一个创建对象接口,由子类决定要实例化的类是哪一个;客户端可以动态地指定工厂子。

参考