设计模式之建造者模式,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
 //请按任意键继续. . .



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建造者模式是一种创建型设计模式,它允许您创建不同类型的对象,而无需暴露对象的创建逻辑。它将对象的构建步骤分解为可重用的部分,并允许您按顺序执行它们。这使得您能够创建具有不同属性的对象,而无需编写大量的重复代码。 在建造者模式中,有一个建造者类,它负责创建对象的特定部分,如电脑的CPU、内存和硬盘等。该类具有一个公共接口,该接口定义了每个部分的构建步骤。在构建步骤完成后,该类可以返回一个完整的对象。 建造者模式也包括一个指导者类,它负责调用建造者类的构建步骤,并按照正确的顺序执行它们。指导者类知道如何创建对象,但不知道如何创建对象的每个部分,因此它将这个工作委托给建造者类。 以下是一个简单的C++实现建造者模式的示例代码: ```cpp #include <iostream> #include <string> class Computer { public: void setCPU(const std::string& cpu) { m_cpu = cpu; } void setMemory(const std::string& memory) { m_memory = memory; } void setHardDisk(const std::string& hardDisk) { m_hardDisk = hardDisk; } void show() { std::cout << "CPU: " << m_cpu << std::endl; std::cout << "Memory: " << m_memory << std::endl; std::cout << "Hard Disk: " << m_hardDisk << std::endl; } private: std::string m_cpu; std::string m_memory; std::string m_hardDisk; }; class Builder { public: virtual ~Builder() {} virtual void buildCPU() = 0; virtual void buildMemory() = 0; virtual void buildHardDisk() = 0; virtual Computer* getResult() = 0; }; class Director { public: void setBuilder(Builder* builder) { m_builder = builder; } void construct() { m_builder->buildCPU(); m_builder->buildMemory(); m_builder->buildHardDisk(); } private: Builder* m_builder; }; class DesktopBuilder : public Builder { public: DesktopBuilder() { m_computer = new Computer; } ~DesktopBuilder() { delete m_computer; } void buildCPU() { m_computer->setCPU("Intel Core i7"); } void buildMemory() { m_computer->setMemory("16GB DDR4 RAM"); } void buildHardDisk() { m_computer->setHardDisk("2TB SATA Hard Disk"); } Computer* getResult() { return m_computer; } private: Computer* m_computer; }; int main() { Director director; DesktopBuilder desktopBuilder; director.setBuilder(&desktopBuilder); director.construct(); Computer* computer = desktopBuilder.getResult(); computer->show(); return 0; } ``` 在这个示例中,我们创建了一个Computer类,它有三个成员变量:CPU、内存和硬盘。我们还创建了一个Builder类,它定义了创建Computer对象的构建步骤,并且为每个部分提供了一个抽象接口。我们还创建了一个Director类,它负责调用建造者类的构建步骤,并按照正确的顺序执行它们。 在具体的建造者实现中,我们创建了一个DesktopBuilder类,它实现了Builder接口,并具有一个Computer成员变量。在DesktopBuilder类的构建步骤中,我们设置了Computer对象的CPU、内存和硬盘。最后,我们返回一个完整的Computer对象。 在main函数中,我们创建了一个Director对象,并将DesktopBuilder对象传递给setBuilder函数。然后我们调用construct函数,它将调用DesktopBuilder的构建步骤,并返回一个完整的Computer对象。我们最后打印出这个对象的属性,以验证它是否被正确构建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值