第六章第二节 可维护的设计模式
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
【工厂模式(Factory Pattern)】html
- 定义:工厂方法模式也被称为虚拟构造器。当client不知道要建立哪一个具体类的实例,或者不想在client代码中指明要具体建立的实例时,用工厂方法。
- 意图:定义一个用于建立对象的接口,让其子类来决定实例化哪个类,从而使一个类的实例化延迟到其子类。
- 主要解决:主要解决接口选择的问题。
- 应用实例: 您须要一辆汽车,能够直接从工厂里面提货,而不用去管这辆汽车是怎么作出来的,以及这个汽车里面的具体实现。
- 优势:
- 一个调用者想建立一个对象,只要知道其名称就能够了。
- 扩展性高,若是想增长一个产品,只要扩展一个工厂类就能够。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
- 缺点:每次增长一个产品时,都须要增长一个具体类和对象实现工厂,使得系统中类的个数成倍增长,在必定程度上增长了系统的复杂度,同时也增长了系统具体类的依赖。这并非什么好事。
- 知足OCP(Open-Closed Principle):—对扩展的开放,对修改已有代码的封闭
- 模式:

非静态方法:算法

静态方法:设计模式

【抽象工厂模式(Abstract Factory)】ide
- 定义:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂建立其余工厂。该超级工厂又称为其余工厂的工厂。
- 在抽象工厂模式中,接口是负责建立一个相关对象的工厂,不须要显式指定它们的类。每一个生成的工厂都能按照工厂模式提供对象。
- 方法:提供接口以建立一组相关/相互依赖的对象,但不须要指明其具体类。
- 用途:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品时使用。例:①当一个UI,包含多个窗口控件,这些控件在不一样的OS中实现不一样。②当一个仓库类,要控制多个设备,这些设备的制造商各有不一样,控制接口有差别
- 优势:当一个产品族中的多个对象被设计成一块儿工做时,它能保证客户端始终只使用同一个产品族中的对象。
- 缺点:产品族扩展很是困难,要增长一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
- 使用场景: 一、QQ 换皮肤,一整套一块儿换。 二、生成不一样操做系统的程序。
- 如下面窗口滚动条为例:
客户端想要一个产品,由窗口和滚动条组成。因而能够交给一个抽象工厂来作,这个工厂负责将产品的组件组装起来成一个完整的产品。不一样的产品继承这个抽象工厂接口,实现本身的工厂方法。ui

下面是具体的实现spa


抽象工厂类型建立的不是一个完整产品,而是“产品族”(遵循 固定搭配规则的多类产品的实例),获得的结果是:多个不一样产品的 object,各产品建立过程对client可见,但“搭配”不能改变。操作系统
本质上,Abstract Factory是把多类产品的factory method组合在一块儿。设计
【建造者模式(Builder Pattern)】代理
- 定义:建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。该 Builder 类是独立于其余对象的。
- 方法:建立复杂对象,包含多个组成部分
- 意图:将一个复杂的构建与其表示相分离,使得一样的构建过程能够建立不一样的表示。
- 关键代码:建造者:建立和提供实例,导演:管理建造出来的实例的依赖关系。
- 应用实例: 一、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是常常变化的,生成出所谓的"套餐"。 二、JAVA 中的 StringBuilder。
- 优势: 一、建造者独立,易扩展。 二、便于控制细节风险。
- 缺点: 一、产品必须有共同点,范围有限制。 二、如内部变化复杂,会有不少的建造类。
- 模式图:

- 例子: 咱们须要一个Pizza的产品,该Pizza产品的part是以三个属性的形式体现,其builder就至关于给三个属性赋值(也可更复杂)。



比较:工厂抽象模式(Factory method)和构造器模式(Builder method)
Abstract Factory建立的不是一个完整产品,而是“产品族”(遵循固定搭配规则的多类产品实例),获得的结果是:多个不一样产品的实例object,各产品建立过程对client可见,但“搭配”不能改变。server
Builder Factory建立的是一个完整的产品,有多个部分组成,client不需了解每一个部分是怎么建立、各个部分怎么组合,最终获得一个产品的完整 object 。
比较:模板方法模式(Template method)和构造器模式(Builder method)
- Template Method:a behavioral pattern 目标是为了复用算法的公共结构(次序)。
- 定义了一个操做中算法的骨架(steps),而将具体步骤的实现延迟到子类中, 从而复用算法的结构并可从新定义算法某些特定步骤的实现逻辑。
- 复用算法骨架,强调步骤的次序
- 子类override算法步骤
- Builder Factory:a creationalpattern 目标是“建立复杂对象”,灵活扩展
- 将一个复杂对象的构造方法与对象内部的具体表示分离出来,一样的构造方法能够创建不一样的表现。
- 不强调复杂对象内部各部分的“次序”
- 子类override复杂对象内部各部分的“建立”
- 适应变化:经过派生新的builder来构造新的对象(即新的内部表示),OCP
## 结构化模式:Structual patterns
【桥接模式(Bridge Pattern)】
【代理模式(Proxy Pattern)】
【组合模式(Composite Pattern)】
## 行为化模式:Behavioral patterns
【中介者模式(Mediator Pattern)】
【观察者模式(Observer Pattern)】
【访问者模式(Visitor Pattern)】
【责任链模式(Chain of Responsibility Pattern)】
【命令模式(Command Pattern)】