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. 【转】Android Building System 总结 - 一醉千年 - CSDN博客

    原文网址:http://www.360doc.com/content/15/0314/23/1709014_455175716.shtml  Android Building System 总结 收藏 ...

  2. Google Map API 学习六

    今天其实收货很大的 1.new google.maps.Circle 就是如何在地图上标注一个圆 3.getAnimation 在这里是通过获取Marker是否存在动作,然后如果存在动作的话,就将动作 ...

  3. css3图片墙

    css相关知识: 1. 使用box-shadow设置图片阴影,为照片加上阴影 eg: box-shadow: 0 0 5px 3px #abc 2. 使用tansform-origin定义变形原点 e ...

  4. poj 2479 Maximum sum (最大字段和的变形)

    题目链接:http://poj.org/problem?id=2479 #include<cstdio> #include<cstring> #include<iostr ...

  5. CPP数组

    数组为函数参数,求出一组数中的最大者;

  6. hdu1195 Open the Lock (DFS)

    Problem Description Now an emergent task for you is to open a password lock. The password is consist ...

  7. ifndef系列

    文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了, ...

  8. Hibernate自定义数据库查询(排序、输出条数)

    Hibernate数据库操作类(eg:TexDAO.java) /* * queryString HQL语句,first开始条数, max输出条数 ,norder排序 * 例: List lis = ...

  9. winform 猜猜看 分类: WinForm 2014-08-21 14:12 267人阅读 评论(0) 收藏

    说明: 1>窗体应用程序. 2>一个窗体(Form1),一个按钮(btnStart),一个文本(labTime) 3>截图: 4>代码如下: using System; usi ...

  10. JDBC基本知识

    JDBC的作用 JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问.因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL ...