大白话建造者模式(Builder Pattern)
前言
起初打算按照之前的日产系列写建造者模式。但参考了网上的很多文章,让我对建造者模式更加的困惑,也害怕自己无法已易懂的方式进行解释。最后通过Google发现了一篇英文文章Builder,使我茅塞顿开。我自己对这篇文章进行了翻译,希望对大家理解建造者模式有帮助。
意图
建造者模式是创建型设计模式,用来逐步创建复杂的对象。使用建造者模式可以使用相同的构造代码生成不同类型、不同表示的对象。

问题
想象一个复杂的对象,它需要大量字段和嵌套对象进行初始化。这种的初始化代码一般会隐藏在一个包含大量参数的庞大构造函数中。

比如,我们来建一个房子对象。建造一个简单的房子需要四面墙、一层地板、一扇门、一对窗户和一个屋顶。但是如果我们想要一个更大更明亮,并且有后院和其他好东西(比如暖气系统、管道和电线)的房子,那该怎么办呢?
最简单的解决方案是继承基本House类并创建一组子类来覆盖所有参数组合,但是后得到大量的子类。任何新的参数都需要进一步扩展这个层次结构。
另一个方法不用派生子类。你可以创建一个包含所有参数的构造函数。这种方法不需要大量的子类,但是存在另外的问题。

在大多数情况下,大部分的参数是不被使用的。这样调用构造函数时会显得代码十分难看。
解决
建造模式建议您从自己的类中提取对象构造代码,将其移动到被称为生成器的独立对象中。

建造者模式将对象构造组织为一组步骤(建墙、建门等)。在Builder对象上执行一系列步骤就可以创建一个对象。最重要的一点是,您无需调用所有的步骤,需要调用需要的步骤即可。
当需要构建产品的各种表现形式时,某些步骤可能需要不同的实现。比如,小屋的墙壁可以用木头建造,但城堡的墙壁需要用石头建造。
这种场景下,可以创建不同的建造者类来实现相同的建造步骤,不同的类型。接下来就可以使用这些建造不同类型的对象。

例如,第一个建造者用木头和玻璃建造一切,第二个用石头和铁建造一切,第三个用黄金和钻石建造一切。通过调用相同的步骤,你可以从第一个建造者那里得到一个普通的房子,从第二个建造者那里得到一个小城堡,从第三个建造者那里得到一个宫殿。
Director
我们可以进一步的将一系列对建造者步骤的调用提取到一个类中,这个类被称为Director。
Director类只定义了执行构建步骤的顺序,而构建器提供了这些步骤的实现。

Direct类不是绝对必要的,我们可以按照特定的顺序直接调用Builder。但是,Director是放置各种可重用构造方案的好方法。
另外,Director类完全隐藏了产品构造的细节。客户端只需要将一个Builder和一个Director关联起来就可以得到构建结果。
结构

- Builder接口声明了对所有类型的生成器都通用的产品构造步骤。
- Concrete Builders 提供了
构建步骤的不同实现。 - Products是需要产生的对象。不同构造器构建的产品可以属于不同的类层级结构(继承)或者接口。
- Director类定义了调用构造步骤的顺序,因此您可以创建和重用产品的特定构造方式。
- Client必须将一个Builder对象与Director关联起来。通常,通过director的构造函数的参数只执行一次。然后,director将该Builder对象用于所有的构造。还有一种方式是将Builder对象传递给Director的方法,可以使用不同的生成器。
场景
- 建造者模式用来拜托过长的构造函数。
- 创建某些产品的不同表示形式,比如石房和木房。
构造复杂对象,将构造代码和业务代码分离。
代码

代码我没有粘过来,直接访问参考文献里的底部即可。
参考文献
https://refactoring.guru/design-patterns/builder
大白话建造者模式(Builder Pattern)的更多相关文章
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- Net设计模式实例之建造者模式(Builder Pattern)
一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
随机推荐
- mysql 第一课 win7艰难的配置与删除注册表重新安装
mysql 这个安装一定要慎重!慎重!慎重! 重要的事情说三遍.. 不会的一定要按步骤来~出错了真的很难受. 详细教程 --> https://jingyan.baidu.com/album/ ...
- python基础七之集合
集合:可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复. 增加 set1 = {'zxc', 'zxf'} set1.add('zxv') # 无序添加 set1.update('zx ...
- java 文件拷贝
需求:源和目标! 那么我们需要源文件和目标文件! 构建管道的时候就需要两个:输出流和输入流管道! Eg: package july7file; //java7开始的自动关闭资源 import java ...
- 【9103】求n的累加和
Time Limit: 10 second Memory Limit: 2 MB 问题描述 用高精度方法,求s=1+2+3+...+n的精确值(n以一般整数输入) Input 文件输入仅一行,输入n ...
- centos7中安装R之前yum依赖的包
#!/bin/bash echo "#########################开始安装依赖环境#####################" yum -y install g ...
- 2018百度之星资格赛A B F
A.调查问卷 度度熊为了完成毕业论文,需要收集一些数据来支撑他的论据,于是设计了一份包含 mm 个问题的调查问卷,每个问题只有 'A' 和 'B' 两种选项. 将问卷散发出去之后,度度熊收到了 nn ...
- Apache工具集
commons-collections-3.2.jar 转自:http://www.open-open.com/lib/view/open1384437456993.html
- FreeSql配合仓储实现软删除
该篇内容由个人博客点击跳转同步更新!转载请注明出处! 前段时间使用FreeSql作为ORM,写了一个简单的CMS,在这里总结一下其中的使用心得. 仓储配合全局过滤器 1. 统一的删除标志 如:数据库字 ...
- 学习python资料
资料链接:https://www.cnblogs.com/wupeiqi/articles/5433893.html
- 【一起学源码-微服务】Nexflix Eureka 源码九:服务续约源码分析
前言 前情回顾 上一讲 我们讲解了服务发现的相关逻辑,所谓服务发现 其实就是注册表抓取,服务实例默认每隔30s去注册中心抓取一下注册表增量数据,然后合并本地注册表数据,最后有个hash对比的操作. 本 ...