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


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

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

  • 相关阅读:
    jmeter之如何减负-实现稳定超高并发测试(性能调优)之正确添加监听器
    正则表达式批量处理数据
    Jmeter计数器实现自增功能
    Python自动化 unittest生成测试报告(HTMLTestRunner)03
    [leetcode 14]Longest Common Prfix
    [leetcode 13]Roman to integer
    [leetcode 12] Inter to Roman
    [leetcode 11]Container With Most Water
    [eetcode 10]Regular Expression Matching
    [leetcode 9]Palindrome Number
  • 原文地址:https://www.cnblogs.com/hithongming/p/9191097.html
Copyright © 2020-2023  润新知