【软件构造】第六章第二节 可维护的设计模式

第六章第二节 可维护的设计模式

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)】

  • 定义:工厂方法模式也被称为虚拟构造器。当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
  • 意图:定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。
  • 主要解决:主要解决接口选择的问题。
  • 应用实例: 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
  • 优点:
    • 一个调用者想创建一个对象,只要知道其名称就可以了。
    • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
    • 屏蔽产品的具体实现,调用者只关心产品的接口。
  • 缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
  • 满足OCP(Open-Closed Principle):—对扩展的开放,对修改已有代码的封闭
  • 模式:

  • 例子:

 非静态方法:

静态方法:

 

【抽象工厂模式(Abstract Factory)】

  • 定义:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
  • 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
  • 方法:提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体类。
  • 用途:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品时使用。例:①当一个UI,包含多个窗口控件,这些控件在不同的OS中实现不同。②当一个仓库类,要控制多个设备,这些设备的制造商各有不同,控制接口有差异
  • 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
  • 使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
  • 以下面窗口滚动条为例:

  客户端想要一个产品,由窗口和滚动条组成。于是可以交给一个抽象工厂来做,这个工厂负责将产品的组件组装起来成一个完整的产品。不同的产品继承这个抽象工厂接口,实现自己的工厂方法。

  下面是具体的实现

  抽象工厂类型创建的不是一个完整产品,而是“产品族”(遵循 固定搭配规则的多类产品的实例),得到的结果是:多个不同产品的 object,各产品创建过程对client可见,但“搭配”不能改变。

  本质上,Abstract Factory是把多类产品的factory method组合在一起。

 

【建造者模式(Builder Pattern)】

  • 定义:建造者模式(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

 

## 结构化模式:Structual patterns

【桥接模式(Bridge Pattern)】

【代理模式(Proxy Pattern)】

【组合模式(Composite Pattern)】

 

## 行为化模式:Behavioral patterns

【中介者模式(Mediator Pattern)】

【观察者模式(Observer Pattern)】

【访问者模式(Visitor Pattern)】

【责任链模式(Chain of Responsibility Pattern)】

【命令模式(Command Pattern)】

posted @ 2018-06-16 18:46  HongmingYou  阅读(535)  评论(0编辑  收藏  举报