Builder 模式
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 模式的更多相关文章
- Joshua Bloch错了? ——适当改变你的Builder模式实现
注:这一系列都是小品文.它们偏重的并不是如何实现模式,而是一系列在模式实现,使用等众多方面绝对值得思考的问题.如果您仅仅希望知道一个模式该如何实现,那么整个系列都会让您失望.如果您希望更深入地了解各个 ...
- Builder模式在Java中的应用
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...
- 创建型模式之Builder模式及实现
建造者(Builder)模式 GOF给出的定义为:建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 应用场景 使用建造者模式是为了将构建复杂对象的过程和它的部件 ...
- Builder模式
原文来源于http://www.iteye.com/topic/71175 对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程 ...
- Android Builder模式在开发中的应用
最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder ...
- JAVA Builder模式构建MAP/LIST的示例
我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...
- [转]C++设计模式:Builder模式
Builder模式要解决的问题是,当我们要创建很复杂的对象时,有时候需要将复杂对象的创建过程和这个对象的表示分离开来.由于在每一步的构造过程中可以映入不同参数,所以步骤相同但是最后的对象却不一样.也就 ...
- Android设计模式源码解析之Builder模式
https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/builder/mr. ...
- Builder模式(建造者模式)
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...
- 设计模式之Builder模式
一.感性认识 二.Builder模式 1.定义 一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.即构建过程相同,但是子部件却不相同. 2.结构说明 Builder: 创建者接口 ...
随机推荐
- Response.ContentType 详细列表 <转>
Response.ContentType 详细列表 不同的ContentType 会影响客户端所看到的效果.默认的ContentType为 text/html 也就是网页格式.代码如: <% ...
- hadoop2.0安装和配置
hadoop2与hadoop1的配置有些许不同,最主要的是hadoop1里的master变成了yarn 这篇文直接从hadoop的配置开始,因为系统环境和jdk和hadoop1都是一样的. hadoo ...
- git 添加忽略文件
使用github for windows客户端添加.gitignore文件: 如下图所示,在github客户端可以看到未提交的更改列表 随便选中一个文件,右链,选择ignore file. 然后会 ...
- Distinct Subsequences——Leetcode
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- Objective-c初始化和便利构造
1.创建一个Student这个类 2.声明和实现 1).在Studnet.h文件中对属性和方法的声明 其中这个方法是带参初始化 而这个方法是便利构造.注意与上边的区别 2.在Studnet.m中实现 ...
- n个灯,k个人的开灯问题
/**有n个灯,编号为1-n.第一个人把所以灯打开,第二个人按下 所有编号为2的倍数的开关,第三个人按下3的倍数的开关,依次类推, 一共有k个人,问最后有哪些灯开着? 样例输入: 7 3 样例输出: ...
- 图形变幻矩阵 Transforms
https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d ...
- 宁波Uber优步司机奖励政策(1月25日~1月31日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- zoj 2734 Exchange Cards【dfs+剪枝】
Exchange Cards Time Limit: 2 Seconds Memory Limit: 65536 KB As a basketball fan, Mike is also f ...
- tabhost中activity跳转动画不显示的解决办法
[1]如果是tabhost中的activity跳到其他的activity,用这篇blog的方法即可 http://blog.sina.com.cn/s/blog_8db8914301010t31.ht ...