Builder(生成器)-对象创建型模式
一.意图
将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。
二.动机
一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加。Bulider模式期望将解析原材料的过程与利用原材料生产产品的过程分离开,以达到用户不需要知道根据原材料构建产品的详细过程,并可以方便的增加新的产品。
三.适用性
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
四.类图

如以上类图所示,Director只负责组建整个流程,并不关心组建的具体过程,组建的细节由每一个Bulider负责。
五.实例代码
#include "Builder.h"
#include "Product.h"
#include <iostream>
#include <cstdlib>
#include <cstdio> class Director
{
public:
Builder* m_builder;
Product * m_product;
Director(Builder*builder) : m_builder(builder)
{ }
void ParseElement(int element)
{
switch (element)
{
case :
m_builder->BuildHouse();
break;
case :
m_builder->BuildHouse();
break;
case :
m_builder->BuildHouse();
}
} Product * GetProduct()
{
m_product = m_builder->GetProduct();
return m_product;
}
};
Director.h
#include "Builder.h"
#include "Product.h"
#include <iostream>
#include <cstdlib>
#include <cstdio> class Director
{
public:
Builder* m_builder;
Product * m_product;
Director(Builder*builder) : m_builder(builder)
{ }
void ParseElement(int element)
{
switch (element)
{
case :
m_builder->BuildHouse();
break;
case :
m_builder->BuildHouse();
break;
case :
m_builder->BuildHouse();
}
} Product * GetProduct()
{
m_product = m_builder->GetProduct();
return m_product;
}
};
Builder.h
#ifndef PRODUCT_H_
#define PRODUCT_H_ class Product
{
public:
Product()
{
}
}; class ProductA : Product
{
public:
ProductA()
{
}
}; class ProductB : Product
{
public:
ProductB()
{
}
}; class ProductC : Product
{
public:
ProductC()
{
}
}; #endif
Product.h
#include "Director.h"
#include "Builder.h" void main()
{
Builder *builder = (Builder *)new BuilderA();
auto director = new Director(builder);
director->ParseElement();
director->ParseElement();
director->ParseElement();
auto product = director->GetProduct(); builder = (Builder *)new BuilderB();
director = new Director(builder);
director->ParseElement();
director->ParseElement();
director->ParseElement();
product = director->GetProduct(); builder = (Builder *)new BuilderC();
director = new Director(builder);
director->ParseElement();
director->ParseElement();
director->ParseElement();
product = director->GetProduct(); while(); }
Test Code
以上实例代码,以建房子为例,其中材料用整数1,2,3模拟,代表不同的材料。Director为解析材料的工作人员。有BuliderA,BuliderB,BuliderC三位建筑师,解析材料的工作人员把材料交给三位建筑师后,将会建造出三种不同的房子。测试结果如下:

六.效果
- 可以改变一个产品的内部表示
- 将构造代码和表示代码分开
- 对构造过程进行更精细的控制。
Builder(生成器)-对象创建型模式的更多相关文章
- 设计模式(3)-对象创建型模式-Abstract Factory模式
1.对象创建型模式 1.3 Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: • 一个系统要独立于它的产品的创建. ...
- 设计模式(4)-对象创建型模式-Prototype模式
1.对象创建型模式 1.4 Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...
- 对象创建型模式------Builder(生成器)
本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用. 假设现在有三种产品,是玩具,都是由三部分组成,头,身体 ...
- 对象创建型模式------Builder(生成器或建造者模式)(2)
链接转自:http://blog.csdn.net/wuzhekai1985/article/details/6667467 主要思想是:首先有个指挥家思想者将大体的设计思路设计出来,然后寻找一部分工 ...
- singleton(单件)-对象创建型模式
1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...
- 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)
意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...
- Singleton模式——对象创建型模式
Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...
- ProtoType(原型)-对象创建型模式
1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者“克隆”一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使 ...
- 对象创建型模式------Abstract Factory(抽象工厂)
1. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.2. 别名 Kit3. 动机 假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 ...
随机推荐
- MPI运行程序(接触)
网友遇到的问题并解决问题:mpich2在多个节点上运行并行程序时出错 我使用mpich2时遇到一下问题: 当我运行一个计算圆周率的并行程序cpi.c时,我想在指定的若干个节点上运行这个程序,比如hos ...
- 从头开始linux-centos
测试环境,下面二者之一CentOS-6.5-x86_64-minimal.isoCentOS-7-x86_64-Minimal-1511.iso 第一步系统检测与优化,即初始化工作,常规型的 rpm ...
- linux下Nginx 安装配置
Nginx 安装 一.首先要安装 PCRE PCRE 作用是让 Ngnix 支持 Rewrite 功能. 1.下载 PCRE 安装包,下载地址: http://downloads.sourceforg ...
- 如何成为一名合格甚至优秀的个人草根站长(转载自ChinaZ)
这章本来不想写来的,后来琢磨琢磨还是废话一下吧.主要是想说下现在草根站长的状态和如何成为一名合格的甚至优秀的草站站长. 伟大的草根站长们,在某些媒体的超级忽悠下全来到网络上淘金来了,有在校的大学生,有 ...
- Hadoop学习18--yarn配置篇-基本配置节点
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <va ...
- hdu 5381 The sum of gcd
知道对于一个数列,如果以x为左(右)端点,往右走,则最多会有log(a[x])个不同的gcd,并且有递减性 所以会分成log段,每一段的gcd相同 那我们可以预处理出对于每一个位置,以这个位置为左端点 ...
- CPS冥想 - 1 重新审视CPS
这篇文章是在阅读Eric Lippert大神的MSDN Blog文章时同步写成的,其中主要是各种翻译,同时还混杂自己阅读文章的笔记和感想. 原博文地址 http://blogs.msdn.com/b/ ...
- 鸟哥的linux私房菜学习
cat /etc/shells 系统拥有的shellcat /etc/passwd 记录用户使用的shell按两次 tab 键可显示所有可执行的指令alias 查看所有命令的别名alias lm='l ...
- Linux修改/etc/profile不生效的问题
今天在原来的机器上修改了JDK的路径配置,但死活不生效. 后来查了~/.bash_profile文件,里面没有配置. 最后查~/.bashrc文件,发现里面有JDK的配置
- (转)AVI文件格式解析+AVI文件解析工具
AVI文件解析工具下载地址:http://download.csdn.net/detail/zjq634359531/7556659 AVI(Audio Video Interleaved的缩写)是一 ...