专栏首页Vincent-yuan设计模式~建造模式

设计模式~建造模式

建造模式是对象的创建模式。

建造模式可以将一个产品的内部表象和产品的生成过程分割开来,

从而可以使一个建造过程生成具有不同的内部表象的产品对象。

不同的产品可以有不同的内部表象,也就是有不同的零件。

对象性质的建造

有些情况条,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。

比如,一个电子邮件发件人地址,收件人地址,主题,内容,附录等部分,在收件人地址得到赋值之前,这个电子邮件不能发出。

有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。

这时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程是建造零件的过程。

建造模式非常适用于此种情况。

建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,

把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。

建造者模式的结构

这个模式涉及到四个角色:

  • 抽象建造者角色(Builder): 给出一个抽象接口,以规范产品对象的各个组成成分的建造。定义了两种方法:1. 建造零件方法;2.结果返还方法。一般来说,产品所包含的零件数目与建造方法的数据相符。
  • 具体建造者角色(Concrete Builder): 这个角色要完成的任务包括:1. 实现抽象建造者 Builder 所声明的接口,给出一步一步的完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。
  • 导演者角色(Director): 担任这个角色的类调用具体建造者角色以创建产品对象。应对指出的是,导演这角色并没有产品类的具体知识,正则拥有产品类的具体知识的是具体建造者角色。
  • 产品角色(Product): 产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

源代码

多个产品类的情况

接口标识的应用

应当注意的是,retrieveProduct() 方法是抽象建造者角色提供的,如果它返还的是 Product1类型或Product2类型的话,

那么ConcreteBuilder2或者Concretebuilder1就会有问题,因为它们应当返还Product1和Product2类型。

解决的方案是为两个具体产品类提供一个共同的接口,形成它们共同的类型。由于建造模式的产品类往往是没有太多关系的一些类,因为,它们不太可能有共同的接口。因此,使用一个标识接口为所有的具体产品类提供一个共同的类型就成为解决问题的方案,即所有的retrieveProduct()都返还Product类型就可以了。

建造模式的活动序列

建造模式的实现

建造模式

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java基础(二):补充

    堆的空间相对较大,就像一个大仓库。由垃圾回收器(GC)进行空间回收工作。堆的访问效率相对较低。

    Vincent-yuan
  • 前端学习(24)~js学习(二):变量

    如果直接使用字面量的话,比较麻烦。比如说,多个地方要用到同一个字面量,还不如事先定义一个变量,用来保存字面量。

    Vincent-yuan
  • 前端学习(30)~js学习(七):流程控制语句-选择结构(if,switch)

    (1)首先,计算出表达式的值,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。

    Vincent-yuan
  • mp3格式转wav格式 附完整C++算法实现代码

    近期偶然间看到一个开源项目minimp3 Minimalistic MP3 decoder single header library 项目地址: https:...

    cpuimage
  • 全方位绕过安全狗

    lonelyvaf
  • 总结:DCIC算法分析赛完整方案分享!

    本文将以DCIC2020赛道二《巡游车与网约车运营特征对比》为具体内容,讲解赛题介绍、赛题理解、赛题任务解析、赛题数据介绍和赛题指标计算。

    Datawhale
  • mysql 快速生成百万条测试数据

    1、生成思路 利用mysql内存表插入速度快的特点,先利用函数和存储过程在内存表中生成数据,然后再从内存表插入普通表中 2、创建内存表及普通表 CREATE T...

    96php.cn
  • 类别不平衡学习:论文/代码/框架/库

    今天向大家介绍一个跟踪不平衡学习问题的Github资源仓库,文末附其中 7 篇相关综述论文下载。

    CV君
  • 视频编码优化之道

    5月20号,在LiveVideoStack音视频技术社区举办的WebRTCon 2018大会上,上海交通大学图像所宋利教授在WebRTC与Codec专题作为出品...

    用户1324186
  • 哈夫曼编码的理解(Huffman Coding)

    哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全...

    233333

扫码关注云+社区

领取腾讯云代金券