《设计模式之禅》学习笔记(八)
第8章 工厂方法模式
工厂方法模式:
Define an interface for creating an object, but let subclassed decide which class to instantiate. Factory Method lets a class defer instantiation to subclassed.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)
工厂方法模式通用类图:
工厂方法模式的优点:
首先,良好的封装性,代码结构清晰。
其次,工厂方法模式的扩展性非常优秀。方便添加产品类。
再次,屏蔽产品类。只需要关心产品的接口,只要接口保持不变,系统中的上层模块就不要发生变化。
最后,工厂方法模式是典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不用关心。
工厂方法模式的使用场景:
首先,工厂方法模式是new一个对象的替代品。但是需要谨慎地考虑是否需要增加一个工厂类进行管理,增加代码的复杂度。
其次,需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。
其次,工厂方法模式可以用在异构项目中。
最后,可以使用在测试驱动开发的框架下。
女娲造人类图(工厂方法模式):
工厂方法模式的扩展:
1. 简单工厂模式
一个模块仅需要一个工厂类,没有必要把它生产出来,使用静态方法就可以了。该模式可以使类图变简单,而且调用者也比较简单。该模式是工厂方法模式的弱化,因为简单,所以成为简单工厂模式(Simple Factory Pattern),也叫做静态工厂模式。其缺点是工厂类的扩展比较困难,不符合开闭原则,但它仍然是一个非常实用的设计模式。
2. 升级为多个工厂类
所有的产品类都放到一个工厂方法中进行初始化会使代码结构不清晰。考虑到需要结构清晰,我们就为每个产品定义一个创造者,然后由调用者自己去选择与哪个工厂方法关联。
给每个产品类都对应一个创造类,好处就是创建类的职责清晰,而且结构简单,但是给可扩展性和可维护性带来了一定影响(每扩展一个产品类,都要建立一个相应的工厂类)。
在复杂应用中一般采用多工厂的方法,然后再增加一个协调类,避免调用者与各子工厂交流。协调类的作用是封装子工厂类,对高层模块提供统一的访问接口。
3. 代替单例模式
通过工厂方法模式也可以只在内存中产生一个对象。
类图:
4. 延迟初始化
一个对象被消费完毕后,并不立即释放,工厂类保持其初始状态,等待再次被使用。
类图: