zoukankan      html  css  js  c++  java
  • 23种设计模式之建造者模式

    建造者模式的定义

    建造者模式也叫生成器模式, 定义如下:

    将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示

    类图如下:

    23种设计模式之建造者模式

     

    在建造者模式中, 四个角色如下:

    1. Product 产品类: 通常是实现了模板方法模式, 也就是有模板方法和基本方法
    2. Builder 抽象建造者: 规范产品的组建, 一般是由子类实现
    3. ConcreteBuilder 具体建造者: 实现抽象类定义的所有方法,并且返回一个组建好的对象.
    4. Director 导演类: 负责安排已有模块的顺序, 然后告诉Builder开始建造.

    先看Product类的代码, 通常他是一个组合或继承产生的类:

    23种设计模式之建造者模式

     

    抽象建造者代码如下:

    23种设计模式之建造者模式

     

    其中 setPart 方法是零件的配置, 其他的对象, 获得一个不同零件,或者不同的装配顺序就可能产生不同的产品

    具体建造者代码如下:

    23种设计模式之建造者模式

     

    导演类代码:

    23种设计模式之建造者模式

     

    导演类起到封装的作用,避免高层模块深入到建造者内部的实现类. 当然, 在建造者模式比较庞大时, 导演类可以有多个

    建造者模式分析

    现在又一个项目,创建不同的汽车, 有奔驰的宝马的, 车有启动、停止、喇叭声音、引擎声音, 不同车有不同的顺序, 开始创建, 先使用模板方法模式, 类图如下

    23种设计模式之建造者模式

     

    在CarModel中定义了一个 setSequence 方法, 车辆模型的这几个动作要如何排布, 是在 ArrayList中定义的. 然后run方法根据 sequence定义的顺序完成指定的顺序动作

    CarModel代码:

    23种设计模式之建造者模式

     

    CarModel是这样设计的, setSequence方法允许客户自己设置一个顺序, 是先启动还是先按喇叭, 在子类中实现其基本方法, 然后同过run方法实现顺序调用

    其实现类代码就不再占用篇幅

    这时有一个要求, 生产一个奔驰模型,要先发动引擎,再启动,然后停下来,不需要按喇叭, 创建代码如下:

    23种设计模式之建造者模式

     

    这样我们就创建了一辆汽车, 但是需求是汽车的执行顺序要能够随意调整, 我们只满足了一个, 还有下一个,下下个, 那怎么办? 我们每次都要写这些来满足. 我们要想办法解决这个问题, 那么我们可以通过建造者, 通过建造者创建, 类图如下

    23种设计模式之建造者模式

     

    其 CarBuilder 代码如下:

    23种设计模式之建造者模式

     

    实现类代码如下

    23种设计模式之建造者模式

     

    这样,我们就可以通过一个导演类,封装各个顺序并返回产品

    23种设计模式之建造者模式

     

    其中的方法可以添加,可以有很多方法

    这样,再创建的时候就轻松多了,直接调用一个方法即可

    这不是一个单纯的建造者模式, 其中使用了模板方法模式

    建造者模式的应用

    优点如下:

    1. 封装性. 使用建造者模式可以是客户端不必知道产品内部组成的细节
    2. 建造者独立, 容易扩展
    3. 便于控制细节风险. 由于具体的建造者是独立的, 因此可以对建造过程逐步细化, 而不对其他的模块产生任何影响

    建造者模式的使用场景:

    1. 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式
    2. 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用
    3. 产品非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适
    4. 在对象创建过程中也会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程.这种场景只能是一个补偿方法, 因为一个对象不容易获得, 而在设计 阶段竟然没有发觉, 而要通过建造者模式柔化创建过程,本身已经违反设计的最初目标

    建造者模式关注的是零件类型和装配工艺(顺序), 这是它与工厂方法模式最大不同的地方, 虽然同为创建类模式, 但是注重点不同


    建造者模式最主要的功能是基本方法的调用顺序安排,而工厂方法则重点是创建

  • 相关阅读:
    Mybatis入门
    Spring的xml文件配置方式实现AOP
    jquery简直是太酷炫强大了
    [Google Guava] 2.2-新集合类型
    小规模的流处理框架.Part 1: thread pools
    数据库三大范式和五大约束
    Hibernate:缓存
    MyBatis:缓存配置
    Python:协程
    微信公众号开发之测试账号
  • 原文地址:https://www.cnblogs.com/hujingnb/p/10171549.html
Copyright © 2011-2022 走看看