Builder 模式和 AbstractFactory 模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder 模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说 Builder 模式中对象不是直接返回的。而在 AbstractFactory 模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。

 ////////////Product.h//////////////////////
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
#include <vector>
#include <string>
class Product
{
public: Product();
~Product();
void Add( std::string part);
void Show(); protected:
private:
std::vector<std::string> svec;
}; #endif
 ////////////Product.cpp//////////////////////
#include "Product.h"
#include <iostream>
using namespace std; void Product::Add( string part)
{
svec.push_back(part);
} void Product::Show()
{
vector<string>::iterator it = svec.begin();
while (it != svec.end())
{
cout<<*it<<" ";
it++;
}
cout<<endl;
} Product::Product(){}
Product::~Product(){}
 ////////////Builder.h//////////////////////
#ifndef _BUILDER_H
#define _BUILDER_H
#include <string>
using namespace std; class Product ;
class Builder
{
public:
virtual ~Builder();
virtual void BuildPartA() = ;
virtual void BuildPartB() = ;
virtual void BuildPartC() = ;
virtual Product* GetProduct() = ;
protected:
Builder();
private: }; class ConcreteBuilder : public Builder
{
public:
~ConcreteBuilder();
ConcreteBuilder(); void BuildPartA();
void BuildPartB();
void BuildPartC();
Product* GetProduct();
protected:
private:
Product* product;
}; class ConcreteBuilder2 : public Builder
{
public:
~ConcreteBuilder2();
ConcreteBuilder2(); void BuildPartA();
void BuildPartB();
void BuildPartC();
Product* GetProduct();
protected:
private:
Product* product;
}; #endif
 /////////Builder.cpp//////////////////
#include "Builder.h"
#include "Product.h"
#include <iostream>
using namespace std; Builder::Builder(){}
Builder::~Builder(){} ConcreteBuilder::ConcreteBuilder()
{
product = NULL;
}
ConcreteBuilder::~ConcreteBuilder()
{ }
void ConcreteBuilder::BuildPartA()
{
product = new Product();
product->Add("A");
cout<<"加入A"<<endl;
} void ConcreteBuilder::BuildPartB()
{
product->Add("B");
cout<<"加入B"<<endl;
} void ConcreteBuilder::BuildPartC()
{
product->Add("C");
cout<<"加入C"<<endl;
} Product* ConcreteBuilder::GetProduct()
{
return product ;
} ConcreteBuilder2::ConcreteBuilder2()
{
product = NULL;
}
ConcreteBuilder2::~ConcreteBuilder2()
{ }
void ConcreteBuilder2::BuildPartA()
{
product = new Product();
product->Add("x");
cout<<"加入x"<<endl;
} void ConcreteBuilder2::BuildPartB()
{
product->Add("y");
cout<<"加入y"<<endl;
} void ConcreteBuilder2::BuildPartC()
{
product->Add("z");
cout<<"加入z"<<endl;
} Product* ConcreteBuilder2::GetProduct()
{
return product ;
}
 ////////////////////////////Director.h//////////////////////////////////////////////
#ifndef _DIRECTOR_H
#define _DIRECTOR_H class Builder;
class Director
{
public:
Director( Builder* bld); ~Director(); void Construct();
protected:
private:
Builder* _bld ;
}; #endif
 //////////////////////////////Director.cpp////////////////////////////////////////////
#include "Director.h"
#include "Builder.h"
using namespace std ; Director::Director(Builder* bld)
{
_bld = bld ;
}
Director::~Director()
{
}
void Director::Construct()
{
_bld->BuildPartA();
_bld->BuildPartB();
_bld->BuildPartC();
}
 /////////////////////////////main.cpp/////////////////////////////////////////////
#include "Builder.h"
#include "Director.h"
#include "Product.h"
using namespace std; int main()
{
Builder* b1 = new ConcreteBuilder();
Director* d1 = new Director(b1);
d1->Construct();
Product* p1 = b1->GetProduct();
p1->Show(); Builder* b2 = new ConcreteBuilder2();
Director* d2 = new Director(b2);
d2->Construct();
Product* p2 = b2->GetProduct();
p2->Show(); system("pause");
return ;
}

以上代码都是经过测试可以正常运行的哦···········

Builder 模式的更多相关文章

  1. Joshua Bloch错了? ——适当改变你的Builder模式实现

    注:这一系列都是小品文.它们偏重的并不是如何实现模式,而是一系列在模式实现,使用等众多方面绝对值得思考的问题.如果您仅仅希望知道一个模式该如何实现,那么整个系列都会让您失望.如果您希望更深入地了解各个 ...

  2. Builder模式在Java中的应用

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  3. 创建型模式之Builder模式及实现

    建造者(Builder)模式 GOF给出的定义为:建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 应用场景 使用建造者模式是为了将构建复杂对象的过程和它的部件 ...

  4. Builder模式

    原文来源于http://www.iteye.com/topic/71175 对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程 ...

  5. Android Builder模式在开发中的应用

    最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder ...

  6. JAVA Builder模式构建MAP/LIST的示例

    我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...

  7. [转]C++设计模式:Builder模式

    Builder模式要解决的问题是,当我们要创建很复杂的对象时,有时候需要将复杂对象的创建过程和这个对象的表示分离开来.由于在每一步的构造过程中可以映入不同参数,所以步骤相同但是最后的对象却不一样.也就 ...

  8. Android设计模式源码解析之Builder模式

    https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr. ...

  9. Builder模式(建造者模式)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  10. 设计模式之Builder模式

    一.感性认识 二.Builder模式 1.定义 一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.即构建过程相同,但是子部件却不相同. 2.结构说明 Builder: 创建者接口 ...

随机推荐

  1. MySQL安装没有弹出配置向导

    安装MySQL过程中一切都正常只是没有弹出MySQL配置向导对话框,即出现"launch the MySQL Instance Configuration Wizard" fini ...

  2. linux性能优化

    一.最小化安装系统二.关闭NetworkManager服务. NetworkManger服务如果启动,当你手动配置网卡时会发生冲突 [root@linuxangel ~]# /etc/init.d/N ...

  3. OpenSource

    SugarCRM 客户关系管理系统(CRM).SugarCRM开源版是一款完全开放源代码的商业开源软件 OPENFILER 基于浏览器的免费网络存储管理实用程序,可以在单一框架中提供基于文件的网络连接 ...

  4. Java GC 专家系列3:GC调优实践

    本篇是”GC专家系列“的第三篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种G ...

  5. 一句话菜刀获取ip详细信息

    <?php $ip="你要查的ip"; $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip ...

  6. c#基础编程—泛型

    一.引言 泛型的主要思想是将算法与数据结构完全分离开,使得一次定义的算法能作用于多种数据结构,从而实现高度可重用的开发.泛型,通过参数类型化来实现在同一份代码中操作多种数据类型,利用“参数化类型”将类 ...

  7. [置顶] Java启动命令大观

    Java启动命令是所有java应用程序的入口,通过它来启动Java运行时环境,并加载相关的class.不过由于IDE的盛行,我们Java程序员中的大多数的并不是非常的了解Java启动命令.本文希望做一 ...

  8. 关于session的实现:cookie与url重写

    本文讨论的语境是java EE servlet. 我们都知道session的实现主要两种方式:cookie与url重写,而cookie是首选(默认)的方式,因为各种现代浏览器都默认开通cookie功能 ...

  9. 微软ASP.NET网站部署指南(10):迁移至SQL Server

    1.  综述 第2章的部署SQL Server Compact和第9章的部署数据库更新里解释了为什么终于要升级到完整版SQL Server .本章节将告诉你怎样来做. SQL Server Expre ...

  10. [置顶] Codeforces Round #198 (Div. 1)(A,B,C,D)

    http://codeforces.com/contest/341 赛后做的虚拟比赛,40分钟出了3题,RP爆发. A计数问题 我们可以对每对分析,分别对每对<a, b>(a走到b)进行统 ...