抽象工厂模式
类图
需要的产品和工厂
- Button 相关
- 产品
- 抽象产品:
interface Button
- 具体产品 1:
class WinButton implements Button
- 具体产品 2:
class MacButton implements Button
- 抽象产品:
- 工厂
- 抽象工厂:
abstract class ButtonFactory
- 具体工厂 1:
class WinButtonFactory extends ButtonFactory
- 具体工厂 2:
class MacButtonFactory extends ButtonFactory
- 抽象工厂:
- 产品
- Checkbox 相关
- 产品
- 抽象产品:
interface Checkbox
- 具体产品 1:
class WinCheckbox implements Checkbox
- 具体产品 2:
class MacCheckbox implements Checkbox
- 抽象产品:
- 工厂
- 抽象工厂:
abstract class CheckboxFactory
- 具体工厂 1:
class WinCheckboxFactory extends CheckboxFactory
- 具体工厂 2:
class MacCheckboxFactory extends CheckboxFactory
- 抽象工厂:
- 产品
使用工厂方法模式实现
在已有代码的基础上,还需要新增以下代码
这个时候存在的问题:
client
无法调用新增的代码- 如果要使
client
正常工作,就需要更改client
的定义,这违背了软件设计中的开闭原则
- 如果要使
- 有重复代码没有被抽象
改进后的代码
- 产品不需要改进
- 需要把工厂抽象出来,即
interface GUIFactory
- 把产品线归纳到一起,例如
MacButton
和MacCheckbox
都归纳到MacFactory
中。
- 如果要生产
LinuxButton和
LinuxCheckbox
,只需要新增一个LinuxFactory
即可 - 如果要增加产品
Radio
,也需要更改GUIFactory
,这违背了软件设计中的开闭原则,但无法避免