桥接模式
类图
不使用桥接模式
抽象工厂模式中的示例代码就是没有使用桥接模式的典范。
其中涉及到的维度有:
- 操作系统:Win、Mac
- 表单控件:Button、Checkbox
工厂有:
- WinButtonFactory
- WinCheckboxFactory
- MacButtonFactory
- MacCheckboxFactory
工厂的数量 = 平台数量 x 表单控件的数量
。如果新增 Linux 平台和 Radio 控件,则工厂数量将会是:
- WinButtonFactory
- WinCheckboxFactory
- WinRadioFactory
- MacButtonFactory
- MacCheckboxFactory
- MacRadioFactory
- LinuxButtonFactory
- LinuxCheckboxFactory
- LinuxRadioFactory
使用桥接模式实现产品组合
桥接模式把类的功能层次和实现层次分离,以便它们独立变化。在上述示例中,如何判断什么是功能层次,什么是实现层次呢?这个需要具体问题具体分析。
经过查阅多个资料,通常会把实体作为抽象层次,另一个维度作为实现层次。换句话说,上述工厂要生产的东西是 Button
和 Checkbox
,则可以把表单控件作为抽象层次来看待,而操作系统作为实现层次。
上述代码中的
FormControl::$system
就是桥
使用桥接模式实现工厂组合
也可以提升一个维度,直接把 Factory
看作产品,即抽象部分。
生产字符串的工厂
先把问题简化,让工厂生成 string
。
上述代码中的
GUIFactory::$system
就是桥
生产表单控件的工厂
再把问题变复杂,让工厂生产 Button
或者 Checkbox
,并把它们抽象为 FormControl
。
上述代码中的
GUIFactory::$system
就是桥