抽象工厂模式
类图

需要的产品和工厂
- 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,这违背了软件设计中的开闭原则,但无法避免