一.意图

将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。

二.动机

一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加。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(生成器)-对象创建型模式的更多相关文章

  1. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  2. 设计模式(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) - ...

  3. 对象创建型模式------Builder(生成器)

    本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用. 假设现在有三种产品,是玩具,都是由三部分组成,头,身体 ...

  4. 对象创建型模式------Builder(生成器或建造者模式)(2)

    链接转自:http://blog.csdn.net/wuzhekai1985/article/details/6667467 主要思想是:首先有个指挥家思想者将大体的设计思路设计出来,然后寻找一部分工 ...

  5. singleton(单件)-对象创建型模式

    1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...

  6. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  7. Singleton模式——对象创建型模式

    Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...

  8. ProtoType(原型)-对象创建型模式

    1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者“克隆”一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使 ...

  9. 对象创建型模式------Abstract Factory(抽象工厂)

    1. 意图    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.2. 别名    Kit3. 动机        假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 ...

随机推荐

  1. 如何设置UNIX/Linux中新创建目录或文件的默认权限

    在unix或者linux中,每创建一个文件或者目录时,这个文件或者目录都具有一个默认的权限,比如目录755,文件644,那么这些默认权限是怎么控制的呢? 答案是"umask"权限掩 ...

  2. NSIS使用记录

    ; 该脚本使用 HM VNISEdit 脚本编辑器向导产生 ; 安装程序初始定义常量 !define PRODUCT_NAME "" !define PRODUCT_VERSION ...

  3. bzoj4617: [Wf2016]Spin Doctor

    Description 大选要到了,受候选人X的要求,你调查了n个人,并记录了每个人的3个信息: ai--他们能记忆π的多少位 bi--他们的头发数量 ci--他们是否会给候选人X投票 你需要找到某个 ...

  4. windowDialog销毁页面的问题

    [结贴] windowDialog销毁页面的问题 [复制链接]     Ghost丶 15 主题 91 帖子 200 积分 中级会员 积分 200 发消息 1# 电梯直达    发表于 2015-8- ...

  5. webform 创建树

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  6. 这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script

    这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script ##转载注明出处:http://www.cnblogs.com/wade-xu/p/4378224.html ...

  7. Esfog_UnityShader教程_镜面反射SpecularReflection

    系列教程第四篇,本来打算昨天写的,有些小偷懒就今天写了,这一期我们来讨论一下关于镜面反射的基本原理和具体代码.这一篇是承接着上一篇<Esfog_UnityShader教程_漫反射DiffuseR ...

  8. Embed dll Files Within an exe (C# WinForms)—Winform 集成零散dll进exe的方法

    A while back I was working on a small C# WinForms application in Visual Studio 2008. For the sake of ...

  9. Android UI 绘制过程浅析(三)layout过程

    前言 上一篇blog中,了解到measure过程对View进行了测量,得到measuredWidth/measuredHeight.对于ViewGroup,则计算出全部children的宽高进行求和. ...

  10. JS的join函数用法

    无意中在网上看到一个关于join比for循环更有效率的说法.虽然不明白为什么,先记一笔. join函数用于数组.返回值为一个字符串.实现的效果就是将数组连成自己想要的字符串,当然是有规律可循的字符串. ...