定义
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
结构图
角色
- 抽象工厂:实现了所有操纵产品的方法,但不实现工厂方法。factoryMethod是抽象方法。
- 具体工厂:必须实现抽象的抽象方法,以实际制造出产品。
- 抽象产品:所有产品的抽象。
- 具体产品:不同的具体产品。
优缺点
优点:
- 符合开闭原则,具有很强的的扩展性、弹性和可维护性。扩展时只要添加一个ConcreteCreator,而无须修改原有的ConcreteCreator,因此维护性也好。解决了简单工厂对修改开放的问题。
- 使用了依赖倒置原则,依赖抽象而不是具体,使用(客户)和实现(具体类)松耦合。
- 客户只需要知道所需产品的具体工厂,而无须知道具体工厂的创建产品的过程,甚至不需要知道具体产品的类名。
缺点:
- 代码量增加
设计原则
依赖倒置原则:要依赖抽象,不要依赖具体类。
我们写代码的时候应该尽量达到以下原则:
- 变量不可以持有具体类的引用
- 不要让类派生自具体类
- 不要覆盖基类中已实现的方法
使用场景
- 当需要一个对象时,我们不需要知道该对象所对应的具体类,只要知道哪个具体工厂可以生成该对象,实例化这个具体工厂即可创建该对象。
- 类的数目不固定,随时有新的子类增加进来,或者是还不知道将来需要实例化哪些具体类。
- 定义一个创建对象接口,由子类决定要实例化的类是哪一个;客户端可以动态地指定工厂子。
参考
- 《Head First设计模式》
- https://blog.csdn.net/qq_39588630/article/details/80478349