设计模式之建造者模式,C++实现

原文地址: http://blog.csdn.net/iuhsihsow


其实一直在文中注明C++实现确实没有太大意义,无非是C++用指针来实现多态而非对象本身。

今天事情比较多,就偷下懒吧。


抄的《大话设计模式》的图



下面是实现代码,恩,基本上也是抄的。照着敲了一遍。大笑

// 建造者模式(Builder),将一个复杂对象的构造与它的表示分离,
 // 使得同样的构建过程可以创建不同的表示
 
 
 // 大概就是把一个整体结构的几个可能变化的部分拆为独立的函数
 // 然后再派生类重载实现的方式
 
 // 主要应对与整体中变化的部件,
 // 而不是流程状态,要不然可以用状态模式,
 // 请求处理的流程可以用职责链模式
 
 // 这次状态不好,就偷懒,直接用《大话设计模式》Java代码,翻译为C++了
 
 
 // 情景,画人物
 // 人物包括 头 手 脚 肚子
 // 人物有两种 胖子和瘦子
 // 胖瘦的区别主要在于肚子不同。
 
 #include "stdafx.h"
 #include <Windows.h>
 #include <iostream>
 
 using namespace std;
 
 
 class PersonBuilder
 {
 public:
 	PersonBuilder(const string & strGrap, const string & strPen)
 	{
 		m_strGraphics = strGrap;
 		m_strPen = strPen;
 	}
 	virtual ~PersonBuilder()
 	{
 
 	}
 	virtual void BuildHead() = 0;
 	virtual void BuildBody() = 0;
 	virtual void BuildLeg() = 0;
 
 protected:
 	string	m_strGraphics;
 	string  m_strPen;
 
 private:
 };
 
 class PersonThinBuilder : public PersonBuilder
 {
 public:
 	PersonThinBuilder(const string & strGrap, const string & strPen)
 		: PersonBuilder(strGrap, strPen)
 	{
 
 	}
 	 void BuildHead()
 	 {
 		 cout<<"With "<<m_strPen.c_str()<<endl;
 		 printf("Draw normal head\n");
 		 cout<<"On"<<m_strGraphics.c_str()<<endl;
 
 	 }
 	 void BuildBody()
 	 {
 		 cout<<"With "<<m_strPen.c_str()<<endl;
 		 printf("Draw thin body\n");
 		 cout<<"On"<<m_strGraphics.c_str()<<endl;
 
 	 }
 	 void BuildLeg()
 	 {
 		 cout<<"With "<<m_strPen.c_str()<<endl;
 		 printf("Draw normal leg\n");
 		 cout<<"On"<<m_strGraphics.c_str()<<endl;
 
 	 }
 
 protected:
 private:
 };
 
 
 class PersonFatBuilder : public PersonBuilder
 {
 public:
 	PersonFatBuilder(const string & strGrap, const string & strPen)
 		: PersonBuilder(strGrap, strPen)
 	{
 
 	}
 	void BuildHead()
 	{
 		cout<<"With "<<m_strPen.c_str()<<endl;
 		printf("Draw normal head\n");
 		cout<<"On"<<m_strGraphics.c_str()<<endl;
 	}
 	void BuildBody()
 	{
 		cout<<"With "<<m_strPen.c_str()<<endl;
 		printf("Draw Fat body\n");
 		cout<<"On"<<m_strGraphics.c_str()<<endl;
 	}
 	void BuildLeg()
 	{
 		cout<<"With "<<m_strPen.c_str()<<endl;
 		printf("Draw normal leg\n");
 		cout<<"On"<<m_strGraphics.c_str()<<endl;
 	}
 
 protected:
 private:
 };
 
 
 class PersonDirector
 {
 public:
 
 	void SetPersonBuilder(PersonBuilder * pb)
 	{
 		m_pPbuilder = pb;
 	}
 
 	void CreatePerson()
 	{
 		m_pPbuilder->BuildHead();
 		m_pPbuilder->BuildBody();
 		m_pPbuilder->BuildLeg();
 	}
 protected:
 private:
 	PersonBuilder * m_pPbuilder;
 
 };
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 	PersonBuilder *pThinBuilder = new PersonThinBuilder("Screen", "YellowPen");
 	PersonBuilder *pFatBuilder  = new PersonFatBuilder("Screen", "WhitePen");
 	PersonDirector pd;
 	pd.SetPersonBuilder(pThinBuilder);
 	pd.CreatePerson();
 	pd.SetPersonBuilder(pFatBuilder);
 	pd.CreatePerson();
 
 	if (pThinBuilder)
 	{
 		delete pThinBuilder;
 		pThinBuilder = NULL;
 	}
 	if (pFatBuilder)
 	{
 		delete pFatBuilder;
 		pFatBuilder = NULL;
 	}
 	return 0;
 }
 
 
 //输出结果
 //With YellowPen
 //Draw normal head
 //OnScreen
 //With YellowPen
 //Draw thin body
 //OnScreen
 //With YellowPen
 //Draw normal leg
 //OnScreen
 //With WhitePen
 //Draw normal head
 //OnScreen
 //With WhitePen
 //Draw Fat body
 //OnScreen
 //With WhitePen
 //Draw normal leg
 //OnScreen
 //请按任意键继续. . .



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值