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: 创建者接口 ...
随机推荐
- Linux学习笔记1——Linux的目录结构
/ 是根目录 ~是主目录 bin 存放二进制可执行文件(Is,cat,mkdir等) boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc 存放系统配置文件 home 存放所有 ...
- 《JavaScript核心概念》基础部分重点摘录
注:<JavaScript核心概念>适合深入了解JavaScript,比我买的<JavaScript框架设计>语言和内容丰富多了(可能是我水平尚浅吧). 1. 作用域 var ...
- TC358746AXBG/748XBG 桥接器说明
为什么需要这个mipi csi-2 bridge 芯片,由于我们用的sensor 芯片是美光的MT9m021,这颗芯片并不支持MIPI 下面是网上摘录的说明可能解释这个问题: Because of t ...
- android进程间通信:使用AIDL
android 的binder其实是基于 openbinder实现的,openbinder的地址:http://www.angryredplanet.com/~hackbod/openbinder/d ...
- 最受IT公司欢迎的50款开源软件
文章来自:云头条编译 本文介绍了多款知名的开源应用软件,科技公司可以用它们来管理自己的 IT 基础设施.开发产品. 过去十年间,许多科技公司已开始畅怀拥抱开源.许多公司使用开源工具来运行自己的 IT ...
- jquery 弹出层
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 不区分大小写的in_array实现 thinkphp框架
// 不区分大小写的in_array实现 function in_array_case($value,$array) { return in_array(strtolower($value),arra ...
- bzoj3673 bzoj3674可持久化并查集
并查集都写不来了qwq 之前写的是错的 sz的初值都是0,这样怎么加就都是0了,水这道题还是可以,但是加强版就过不了了 #include<cstdio> #include<cstri ...
- UVa1607 poj1435 UVaLive1686 Gates
填坑系列(p.246) 由函数连续性得满足二分性 #include<cstdio> #include<cstring> #include<cstdlib> #inc ...
- 10个精妙的Java编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...