工厂方法模式
将模板方法模式用于生成实例,模板方法模式就演变为工厂方法模式。但是也失去了模板方法模式最核心的概念:父类中的
templateMethod
定义了不可变的处理流程(核心算法),不允许子类重写该方法。
类图
简化模板方法
把模板方法中的示例代码进行简化,如下:
此时,上述代码已经实现了工厂方法模式,A
类和 B
类就是两个具体的工厂。但是该工厂创建的是 void
,因为 step1()
没有返回值。
继续改造代码
- 给定返回值
- 修改函数名和类名,让其更加表意
- 修改
templateMethod
方法名,让其更加表意
创建 string 的工厂
createProduct
可以返回(创建)不同类型的数据,此处把返回值限定为一个字符串(可以理解为一个创建字符串的工厂),具体的创建逻辑交给子类负责。
和模板方法不同,由于不需要在父类中规定算法流程,所以上述的
StringFactory
可以用接口来代替。
把 string 产品化
各种教材上所说的:工厂方法模式主要用于定义一个接口用于创建对象,但让子类来决定哪个类进行实例化。此时可以把 string
变成一个类(即所谓的产品),即 ShortString
和 LongString
。
创建 Button 产品的工厂
这是另一示例,此处的产品是 Button
。这个示例中使用接口作为抽象工厂。
如果在上述代码的基础上,引入另一个产品 checkbox
,则产品一共有:WinButton
、MacButton
、WinCheckbox
、MacCheckbox
。对于这种情况,需要引入抽象工厂模式。