【创建型】Builder模式
生成器模式的主要思想:将产品对象的创建与表现分离开,并且同样的创建过程可以有不同的产品表现。
直白一点可以理解为:待创建的对象是复杂的,一般情况下是需要经过多个步骤的创建后,最终才能将完整产品创建好,而且每个步骤所创建的都只是产品的一部分而已。这一切的创建步骤,由统一的执导者来完成,称之为:Director(即:导演)。而产品以及组成产品的各个部分的生成细节,由生成器(或者称之为创建者、构建者也行)来完成,称之为:Builder。因此,类关系图参考如下:
由图可知,对Client来说,同样的执导者,是可以生成不同的产品的,并且最重要的是这一切的构建过程,对它来说是完全透明的,其实它也完全不关心(也不需要关心)产品是如何创建出来的,他只要结果(即:产品)。因此,Client想要什么样的产品,只需要使用相应的生成器去构建即可,仅此而已。
关于该模式的协作图参考如下:
由协作图可清晰看出Client、Director、Builder之前的协作关系。模式的编码结构参考如下:
namespace builder
{
// -------- 产品 --------
class Product1 {};
class Product2 {}; // -------- 生成器 --------
class Builder
{
public:
virtual void buildPartA() { /*some code here........*/ }
virtual void buildPartB() { /*some code here........*/ }
virtual void buildPartC() { /*some code here........*/ }
// ........
virtual void buildPartN() { /*some code here........*/ } };//class Builder
class ConcreteBuilder1 : public Builder
{
public:
virtual void buildPartA() { /*some code here........*/ }
virtual void buildPartC() { /*some code here........*/ }
virtual void buildPartE() { /*some code here........*/ }
// ........ Product1* getProduct1() { return m_pProduct1; } private:
Product1* m_pProduct1; };//class ConcreteBuilder1
class ConcreteBuilder2 : public Builder
{
public:
virtual void buildPartB() { /*some code here........*/ }
virtual void buildPartC() { /*some code here........*/ }
virtual void buildPartD() { /*some code here........*/ }
// ........ Product2* getProduct1() { return m_pProduct2; } private:
Product2* m_pProduct2; };//class ConcreteBuilder2 // -------- 导演 --------
class Director
{
public:
void construct() {
auto pBuilder = this->getBuilder();
if (nullptr == pBuilder) {
return;
}
pBuilder->buildPartA();
pBuilder->buildPartB();
pBuilder->buildPartC();
// ........
pBuilder->buildPartN();
} void setBuilder(Builder* pBuilder) { m_pBuilder = pBuilder; } private:
Builder* getBuilder() { return m_pBuilder; } private:
Builder* m_pBuilder; };//class Director // -------- 客户 --------
class Client
{
public:
void test() {
auto pBuilder = new (std::nothrow) ConcreteBuilder1();
auto pDirector = new (std::nothrow) Director();
if (nullptr == pBuilder || nullptr == pDirector) {
// some code like below.
//SAFE_DELETE(pBuilder);
//SAFE_DELETE(pDirector);
return;
}
pDirector->setBuilder(pBuilder);
pDirector->construct();
auto pMyProduct = pBuilder->getProduct1();
// some other code here........
} };//class Client }//namespace builder
生成器模式编码结构参考
下在举一个例子说明一下该模式,个人认为,该例子对于该模式的诠释比许多书本上的例子都更好、更加的形象:
一个人想要建一栋房子,于是他出钱找到了一个施工队,谈好价钱后,施工队就开始可行性分析、绘制图纸........,最后一切准备就序,此时施工队的项目主管就到现场“指手划脚”了,第一天让xxx工人去挖地基;第二天让yyy去布钢筋浇水泥;第三天........;最后房子的所有结构全部完成,房子建好了。于是房子的主人就过来验收了。
这里出钱的人就是 Client,施工队的主管就是 Director,施工队中的施工班子(就是那些辛辛苦苦的农民工、打工仔等)就是 Builder。
还有,突然有一天,该出钱的人,觉得这房子住腻了,想重新整整。很简单,他再出钱,重新再去找一个施工队即可。因为前后找的是不同的施工队,前一个建出来的房子是中式风格,现在找的施工队要求是建成欧式风格的。因此,最终建出来的房子,就肯定不一样了。
a) 这一切,对于出钱的人来说,房子是怎么建成的,他不关心,他只关心最终的产品是他想要的即可。他不会产心这房子是先打地基的,还是先浇水泥的。
b) 施工班子,这些人,每个人都有他们自己的岗位职责,有的是砌墙的、有的是挖土的、有的是搬石头的、........、有的是测量的,等等。这些人什么时候出班,谁先做好后,后面其他职责的人才可以上场做下一环节的工作等等等等,这些全都是要听主管的。(要不实际工程项目中,出一点差错,都是好多钱钱,这些人赔不起的)。
c) 主管,对他来说,不同的主管其实完全可以使用完全一样的工序来“指手划脚”的。当然,个人认为,设计模式我们学的是思想,并不能死板地学。该模式的定义中是说:Builder可以换,那试想下,我们Director就不能换吗?其实也可以换的。因此对主管来说,他们可以按照完全相同的一套标准工序来指导施工班子去建房子。当然他们也可以有自己的独特想法,加入特有工序。
以上仅个人理解,欢迎交流。如果有描述不当之处,欢迎指正。
【创建型】Builder模式的更多相关文章
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...
- 创建型-生成器模式(Builder)
1.意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.场景描述: 编辑软件的“另存为”功能便是生成器模式的一个体现.例如,Word的另存为功能,可以选择将文件存储 ...
- 设计模式学习之建造者模式(Builder,创建型模式)(6)
假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...
- 建造者模式与原型模式/builder模式与prototype模式/创建型模式
建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...
- OOAD-设计模式(三)之创建型设计模式(5种)
前言 前面介绍了OOAD的基础知识,现在我们来详细的说明一下GOF设计模式中的23种模式,希望大家能够学到东西! 一.工厂方法模式(Factory Method) 1.1.工厂方法模式概述 工厂方法模 ...
- Java开发中的23种设计模式详解(1)创建型
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 大话设计模式宏观总结——创建型&结构型&行为型
师傅验收项目的时候.问大话设计模式那三种类型的差别和联系是什么,顿时我傻了眼.由于除了知道这三种类型分别如何称呼以外.从来都没想过为什么这样划分?于是,我便回答:我没想过这个问题.若是从字面上来理解的 ...
- 【转】设计模式(三)建造者模式Builder(创建型)
(http://blog.csdn.net/hguisu/article/details/7518060) 1. 概述 在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对 ...
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- 设计模式(三)建造者模式Builder(创建型)
1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...
随机推荐
- Visual studio 能否定位打开文件在项目中的位置
文件位置:http://zhidao.baidu.com/link?url=FmwuCXTR2ptnRfqr7xGGPrnoXaONDAWgvO6iP4Dn736DwL7hEZCwQqanJbE0di ...
- [Data Structure] 红黑树( Red-Black Tree ) - 笔记
1. 红黑树属性:根到叶子的路径中,最长路径不大于最短路径的两倍. 2. 红黑树是一个二叉搜索树,并且有 a. 每个节点除了有左.右.父节点的属性外,还有颜色属性,红色或者黑色. b. ( 根属性 ...
- nova-network创建初始化网络
nova-network创建初始化网络
- EMV/PBOC 解析(一) 卡片文件结构
刚到公司老大便发我一份文档<智能卡ISO7816-4规范(中文版)>,然后就让我研究下IC智能卡数据读取和支付.身为一直做.NET开发的我对硬件啥的一无所知,各种无头绪啊,研究了两天后,稍 ...
- 左移运算符<<
在许多计算机编程语言(例如:C语言.C++语言.Java语言.JavaScript语言,Pascal语言等)中,“<<”代表左移运算符(就相当于'shl').该运算符为双目运算符,结合方向 ...
- myeclipse快捷键收集整理
Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt ...
- POJ Farm Tour
Farm Tour 题目: 约翰有N块地,家在1号,而N号是个仓库.农场内有M条道路(双向的),道路i连接这ai号地和bi号地,长度为ci. 约翰希望依照从家里出发,经过若干地后达到仓库.然后再返回家 ...
- Android 用ping的方法判断当前网络是否可用
判断网络的情况中,有个比较麻烦的情况就是连上了某个网络,但是那个网络无法上网 ,,, = = 想到了用ping指令来判断,经测试,可行~ ~ ~ private static final boolea ...
- 【移动开发】Android中WIFI开发总结(一)
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热 ...
- Java基础知识强化81:Math类random()方法之获取任意范围的随机数案例(面试题)
1. 需求:设计一个方法,可以实现获取任意范围内的随机数 分析:使用方法random()如下: public static double random() 注:Returns a pseudo-ran ...