zoukankan      html  css  js  c++  java
  • 【软件构造】第六章第二节 可维护的设计模式

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

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

  • 相关阅读:
    luogu P1833 樱花 看成混合背包
    luogu P1077 摆花 基础记数dp
    luogu P1095 守望者的逃离 经典dp
    Even Subset Sum Problem CodeForces
    Maximum White Subtree CodeForces
    Sleeping Schedule CodeForces
    Bombs CodeForces
    病毒侵袭持续中 HDU
    病毒侵袭 HDU
    Educational Codeforces Round 35 (Rated for Div. 2)
  • 原文地址:https://www.cnblogs.com/hithongming/p/9191097.html
Copyright © 2011-2022 走看看