码迷,mamicode.com
首页 > 编程语言 > 详细

建造者模式之C++实现

时间:2017-07-14 10:02:43      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:text   rod   rgb   引用   private   net   using   pre   --   

说明:本文仅供学习交流,转载请标明出处。欢迎转载!

        建造者模式(Builder)也叫生成器模式,我们都知道。假设我们想完毕一个复杂产品的创建过程,我们必须分开创建。再组装。

比方说自行车,有铁架、车铃、车座、轮胎、钢圈

假设我们须要组装一个自行车,必须有这些东西,从创建者模式的角度分析。我们把自行车视为“产品”。把铁架、车铃、车座...等视为“部件”。而不同的部件的价格和性能也表现不一样。所以我们再组装前必须依据实际情况来选择对应的部件,这个过程我们能够总结为:在选择详细的部件之后进行组装,得到我们预期的自行车

        通过以上分析后。给出建造者模式定义:

        建造者模式:将一个复杂对象的构建和它的表示分离,使得相同的构建过程能够创建不同的表示。

        对上面的定义中给出两点说明:

         1.对象的表示宏观概念,构建对象我们须要做些什么?(做什么

         2.对象的构建微观观念。构建对象我们应该怎么做?(怎么做

        建造者模式的结构图

         技术分享

本图来自《大话设计模式》

          C++实现代码:

#include<iostream>
#include<list>
#include<string>
#include<algorithm>//for_each(b,e,Fun)
using namespace std;

template<typename T>
struct ShowFun//定义一个仿函数,供for_each函数使用
{
	void operator()(T t)
	{
		cout<<t<<endl;
	}
};
class Product//详细产品类
{
private:
	list<string> parts;
public:
	void Add(string part)//为产品加入部件
	{
		parts.push_back(part);
	}
	void Show()//显示产品的各个部件
	{
		cout<<endl<<"产品 创建----"<<endl;
		for_each(parts.begin(),parts.end(),ShowFun<string>());//输出产品
	}
};

class Builder//抽象建造者
{
public:
	virtual void BuildPartA()=0;//创建部件A
	virtual void BuildPartB()=0;//创建部件B
	virtual Product GetResult()=0;//返回加入部件后得到的产品的结果
};
class ConcreteBuilder1:public Builder//详细建造者1,注意C++默认的继承方式为private
{
private:
	Product p;//内置产品类,聚合关系
public:
	void BuildPartA()//加入部件A
	{
		p.Add("部件A");
	}
	void BuildPartB()//加入部件B
	{
		p.Add("部件B");
	}
	Product GetResult()//返回产品对象
	{
		return p;
	}
};

class ConcreteBuilder2:public Builder//详细建造者2
{
private:
	Product p;//内置产品类。聚合关系
public:
	void BuildPartA()//加入部件A
	{
		p.Add("部件X");
	}
	void BuildPartB()//加入部件B
	{
		p.Add("部件Y");
	}
	Product GetResult()//返回产品对象
	{
		return p;
	}
};
class Director//管理者类个,依据用户的需求创建小人对象
{
public:
	void Construct(Builder& b)//用引用实现多态
	{
		b.BuildPartA();
		b.BuildPartB();
	}
};
int main()
{
	Director director;
	/********建造者1**********/
	Builder &b1=ConcreteBuilder1();
	director.Construct(b1);//创建
	b1.GetResult().Show();//显示上面创建的产品

	/*******创建这2*******/
	Builder &b2=ConcreteBuilder2();
	director.Construct(b2);
	b2.GetResult().Show();//显示上面创建的产品
	return 0;
}

          測试结果

       技术分享

參考资料:

[1]《大话设计模式》

[2]《设计模式之禅》

[3]《HeadFirst设计模式》


建造者模式之C++实现

标签:text   rod   rgb   引用   private   net   using   pre   --   

原文地址:http://www.cnblogs.com/ljbguanli/p/7168260.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!