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. 在对象创建过程中也会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程.这种场景只能是一个补偿方法, 因为一个对象不容易获得, 而在设计 阶段竟然没有发觉, 而要通过建造者模式柔化创建过程,本身已经违反设计的最初目标

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23种设计模式之原型模式

原型模式的定义 定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象. 通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象 原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象…

课堂笔记——Data Mining(1)

一、Introduction …… 1、Major Issues in Data Mining User Interaction Presentation and visualization of data mining results : Efficiency and Scalability Diversity of data types: complex types of data; Mining dynamic, networked, and global data reposit…

23种设计模式之代理模式

代理模式的定义 代理模式是一个使用率非常高的模式,其定义为: 为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫做委托模式, 它是一项基本设计技巧. 许多其他的模式, 如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式, 而且在日常的应用中,…

论文翻译——FingerSound:Recognizing unistroke thumb gestures using a ring

1. INTRODUCTION 可穿戴计算已经发展到相当大的消费市场,近年来已经有了大量的应用。可穿戴设备 - 最突出的智能手表和屏幕带,以及Oculus Rift等移动虚拟现实设备 - 现在可以被视为商品硬件,大部分人口在日常生活中使用它们。随着这种普及&am…

23种设计模式之中介者模式

中介者模式的定义 中介者模式, 当多个类彼此关联, 会增大耦合性, 这时各个模块通过中介者进行交流, 每个模块只负责自己的业务逻辑, 不属于自己的就丢给中介者, 降低耦合 定义: 用一个中介对象封装一系列的对象交互, 中介者使各对象不需要显示的相互作用,从而使其耦合松散,而…

23种设计模式之命令模式

命令模式的定义 定义: 将一个请求封装成一个对象, 从而让你使用不同的请求将客户端参数化, 对请求排队或者记录请求日志, 可以提供命令的撤销和恢复功能 通俗的说, 就是当有不同的请求时, 将每一种请求都封装成一个对象, 不同的请求调用不同的执行者来执行 命令模式的通用类…

23种设计模式之责任链模式

责任链模式的定义 定义: 使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求,直到有对象处理它为止 通俗的讲, 就是将对请求的处理组成一条链, 当请求来时, 在链中依次传递, 知道找到能够处理此请求的…

Android Studio Process 'command ...\aapt.exe'' finished with non-zero exit value 1

错误:Process command "...\build-tools\27.0.3\aapt.exe finished with non-zero exit value 1 org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: Execution failed for task :app:processDebugResour…

23种设计模式之装饰模式

装饰模式的定义 定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说, 装饰模式相比生成子类更为灵活. 通俗的说, 就是对一个类或方法进行包装 装饰模式的通用类图: 类图中的四个角色说明如下: Component 抽象构件: Component是一个接口或抽象类, 就是定义我们最核心…

23种设计模式之策略模式

策略模式的定义 定义: 定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换 通俗的说, 就是对一个接口下的一组算法进行封装 其类图如下: 其中三个角色说明: Strategy 抽象策略角色: 策略、算法家族的抽象, 通常为接口, 定义每个策略或算法必须具有的方法和属性Co…

23种设计模式之门面模式

门面模式的定义 定义: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行. 门面模式提供一个高层次的接口, 使得子系统更易于使用. 通俗的说, 就是设计一个类,专门用于对外服务的, 门面对象是外界访问子系统内部的唯一通道 其类图如下: 其中两个角色如下: Fac…

转载:Android Studio 3.1.2 新项目报错 AAPT2 error: check logs for details (Gradle 3.1.2)

转载自 https://blog.csdn.net/u011618035/article/details/80574645 原本好好的项目,突然有一天打开就开始报错AAPT2 error: check logsfor details。展开错误详细信息错误文本com.android.build.gradle.tasks.ResourceException:Error: java.util.concurrent.Exec…

23种设计模式之迭代器模式

迭代器模式的定义 定义: 它提供一种方法访问一个容器对象中各个元素, 而又不需暴露该对象的内部细节 其类图如下: 其中角色: Iterator 抽象迭代器: 抽象迭代器负责定义访问和遍历元素的接口, 而且基本上是有固定的三个方法: first()获得第一个元素, next()访问下一个元素, i…

23种设计模式之适配器模式

适配器模式的定义 定义: 将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 通俗的说, 就是有 A、B两个接口, 现在要求把A和B安装在一起使用, 两者的接口不一致, 怎么办? 引入一个物体C, 如下图: 引入C物体后,…

23种设计模式之组合模式

组合模式的定义 定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通俗的说, 就是实现了树形结构 通用类图如下: 其中的三个角色如下: Component 抽象构件角色: 定义参加组合对象的共有方法和属性, 可以…

23种设计模式之观察者模式

观察者模式的定义 定义: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 通俗的说, 就是一个类的某个条件满足时, 会调用一系列定义好的方法 其类图如下: 其中的4个角色: Subject 被观察者: 定义被观察者必须实现…

23种设计模式之访问者模式

访问者模式的定义 定义: 封装一些作用于某种数据结构中的各元素的操作, 它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访问者进行访问 其类图如下: 各角色说明: Vistor 抽象访问者: 抽象类…

23种设计模式之解释器模式

解释器模式的定义 定义: 给定一门语言,定义它的文法的一种表示, 并定义一个解释器, 该解释器使用该表示来解释语言中的句子. 其类图如下: 其中的角色说明: AbstractExpression 抽象解释器: 具体的解释任务由各个实现类完成TerminalExpression 终结符表达式: 实现与文法中的元…

23种设计模式之备忘录模式

备忘录模式的定义 定义: 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可将该对象回复到原先保存的状态 通俗的说, 就是记录下类的当前状态, 当需要的时候恢复 类图如下: 其中各角色如下: Originator 发起人角色: 记录当前时刻…

23种设计模式之状态模式

状态模式的定义 定义: 当一个对象内在状态改变时允许其改变行为, 这个对象看起来像改变了其类 通俗的说, 就是一个事物有不同的状态,在不同状态下执行各个方法时有不同的表现, 将每个状态都封装成一个类, 然后通过上下文对象统一管理 其类图如下: 其中的三个角色如下: Stat…