第六章第二节 可维护的设计模式
Outline
- 创造性模式:Creational patterns
- 工厂模式(Factory Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
- 建造者模式(Builder Pattern)
- 结构化模式:Structural patterns
- 桥接模式(Bridge Pattern)
- 代理模式(Proxy Pattern)
- 组合模式(Composite Pattern)
- 行为化模式:Behavioral patterns
- 中介者模式(Mediator Pattern)
- 观察者模式(Observer Pattern)
- 访问者模式(Visitor Pattern)
- 责任链模式(Chain of Responsibility Pattern)
- 命令模式(Command Pattern)
Notes:
## 创造性模式:Creational patterns
- 定义:工厂方法模式也被称为虚拟构造器。当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
- 意图:定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。
- 主要解决:主要解决接口选择的问题。
- 应用实例: 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
- 优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
- 缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
- 满足OCP(Open-Closed Principle):—对扩展的开放,对修改已有代码的封闭
- 模式:
- 例子:
非静态方法:
静态方法:
- 定义:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
- 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
- 方法:提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体类。
- 用途:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品时使用。例:①当一个UI,包含多个窗口控件,这些控件在不同的OS中实现不同。②当一个仓库类,要控制多个设备,这些设备的制造商各有不同,控制接口有差异
- 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
- 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
- 使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
- 以下面窗口滚动条为例:
客户端想要一个产品,由窗口和滚动条组成。于是可以交给一个抽象工厂来做,这个工厂负责将产品的组件组装起来成一个完整的产品。不同的产品继承这个抽象工厂接口,实现自己的工厂方法。
下面是具体的实现
抽象工厂类型创建的不是一个完整产品,而是“产品族”(遵循 固定搭配规则的多类产品的实例),得到的结果是:多个不同产品的 object,各产品创建过程对client可见,但“搭配”不能改变。
本质上,Abstract Factory是把多类产品的factory method组合在一起。
- 定义:建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。该 Builder 类是独立于其他对象的。
- 方法:创建复杂对象,包含多个组成部分
- 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
- 关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
- 应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
- 优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
- 缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
- 模式图:
- 例子: 我们需要一个Pizza的产品,该Pizza产品的part是以三个属性的形式体现,其builder就相当于给三个属性赋值(也可更复杂)。
比较:工厂抽象模式(Factory method)和构造器模式(Builder method)
Abstract Factory创建的不是一个完整产品,而是“产品族”(遵循固定搭配规则的多类产品实例),得到的结果是:多个不同产品的实例object,各产品创建过程对client可见,但“搭配”不能改变。
Builder Factory创建的是一个完整的产品,有多个部分组成,client不需了解每个部分是怎么创建、各个部分怎么组合,最终得到一个产品的完整 object 。
比较:模板方法模式(Template method)和构造器模式(Builder method)
- Template Method:a behavioral pattern 目标是为了复用算法的公共结构(次序)。
- 定义了一个操作中算法的骨架(steps),而将具体步骤的实现延迟到子类中, 从而复用算法的结构并可重新定义算法某些特定步骤的实现逻辑。
- 复用算法骨架,强调步骤的次序
- 子类override算法步骤
- Builder Factory:a creationalpattern 目标是“创建复杂对象”,灵活扩展
- 将一个复杂对象的构造方法与对象内部的具体表示分离出来,同样的构造方法可以建立不同的表现。
- 不强调复杂对象内部各部分的“次序”
- 子类override复杂对象内部各部分的“创建”
- 适应变化:通过派生新的builder来构造新的对象(即新的内部表示),OCP