C++设计模式——建造者(Builder)模式:给公主换衣服

想必很多少男少女都玩过给公主换衣服的小游戏,我们如何用代码模拟这一过程呢?要求是我们需要给三个国家的不同公主完成戴帽子、穿衣服、穿鞋子三个不同的动作(我们用Id表示公主服装的编号)。
在这里插入图片描述

#include <iostream>
using namespace std;

namespace _ChangeTheSuit{
	class Princess {
	public:
		/*
		virtual void PutOnTheHat(string Id) = 0;
		virtual void PutOnTheClothes(string Id) = 0;
		virtual void PutOnTheShoes(string Id) = 0;
		void Assemble(string Id) {
			PutOnTheHat(Id.substr(1, 3));
			PutOnTheClothes(Id.substr(4, 6));
			PutOnTheShoes(Id.substr(7, 9));
		}*/
		virtual ~Princess() {}
	};

	class ChinesePrincess : public Princess {
	public:
		/*virtual void PutOnTheHat(string Id) {
			cout << "帮中国公主戴上帽子" << endl;
		}
		virtual void PutOnTheClothes(string Id) {
			cout << "帮中国公主穿上衣服" << endl;
		}
		virtual void PutOnTheShoes(string Id) {
			cout << "帮中国公主穿上鞋子" << endl;
		}*/
	};

	class AmericaPrincess : public Princess {
	public:
		/*virtual void PutOnTheHat(string Id) {
			cout << "帮美国公主戴上帽子" << endl;
		}
		virtual void PutOnTheClothes(string Id) {
			cout << "帮美国公主穿上衣服" << endl;
		}
		virtual void PutOnTheShoes(string Id) {
			cout << "帮美国公主穿上鞋子" << endl;
		}*/
	};

	class EnglandPrincess : public Princess {
	public:
		/*virtual void PutOnTheHat(string Id) {
			cout << "帮英国公主戴上帽子" << endl;
		}
		virtual void PutOnTheClothes(string Id) {
			cout << "帮英国公主穿上衣服" << endl;
		}
		virtual void PutOnTheShoes(string Id) {
			cout << "帮英国公主穿上鞋子" << endl;
		}*/
	};

	class PrincessBuilder {
	public:
		virtual ~PrincessBuilder() {}

		virtual void PutOnTheHat(string Id) = 0;
		virtual void PutOnTheClothes(string Id) = 0;
		virtual void PutOnTheShoes(string Id) = 0;

		/*void Assemble(string Id) {
			PutOnTheHat(Id.substr(1, 3));
			PutOnTheClothes(Id.substr(4, 6));
			PutOnTheShoes(Id.substr(7, 9));
		}*/
		Princess* GetPrincess() {
			return m_princess;
		}
	protected:
		Princess* m_princess;
	};

	class ChinesePrincessBulider : public PrincessBuilder {
	public:
		ChinesePrincessBuilder() {
			m_princess = new ChinesePrincess();
		}
		virtual void PutOnTheHat(string Id) {
			cout << "帮中国公主戴上帽子" << endl;
		}
		virtual void PutOnTheClothes(string Id) {
			cout << "帮中国公主穿上衣服" << endl;
		}
		virtual void PutOnTheShoes(string Id) {
			cout << "帮中国公主穿上鞋子" << endl;
		}
	};

	class AmericanPrincessBulider : public PrincessBuilder {
	public:
		AmericanPrincessBuilder() {
			m_princess = new AmericanPrincess();
		}
		virtual void PutOnTheHat(string Id) {
			cout << "帮美国公主戴上帽子" << endl;
		}
		virtual void PutOnTheClothes(string Id) {
			cout << "帮美国公主穿上衣服" << endl;
		}
		virtual void PutOnTheShoes(string Id) {
			cout << "帮美国公主穿上鞋子" << endl;
		}
	};

	class EnglandPrincessBulider : public PrincessBuilder {
	public:
		EnglandPrincessBuilder() {
			m_princess = new EnglandPrincess();
		}
		virtual void PutOnTheHat(string Id) {
			cout << "帮英国公主戴上帽子" << endl;
		}
		virtual void PutOnTheClothes(string Id) {
			cout << "帮英国公主穿上衣服" << endl;
		}
		virtual void PutOnTheShoes(string Id) {
			cout << "帮英国公主穿上鞋子" << endl;
		}
	};

	class PrincessDirector {
	public:
		PrincessDirector(PrincessBuilder* tempPBuilder) {
			m_PrincessBuilder = tempPBuilder;
		}
		Princess* Constructor(string Id) {
			m_PrincessBuilder->PutOnTheHat(Id.substr(1, 3));
			m_PrincessBuilder->PutOnTheClothes(Id.substr(4, 6));
			m_PrincessBuilder->PutOnTheShoes(Id.substr(7, 9));
			return m_PrincessBuilder->GetPrincess();
		}
	private:
		PrincessBuilder* m_PrincessBuilder;
	};
};

int main() {
	/*_ChangeTheSuit::Princess* my_princess = new _ChangeTheSuit::ChinesePrincess();
	my_princess->Assemble("123456789");*/

	_ChangeTheSuit::PrincessBuilder* my_builder = new _ChangeTheSuit::ChinesePrincessBulider();
	_ChangeTheSuit::PrincessDirector* my_director = new _ChangeTheSuit::PrincessDirector(my_builder);
	_ChangeTheSuit::Princess* my_Princess = my_director->Constructor("123456789");
	delete my_builder;
	delete my_director;

	getchar();
	return 0;
}

由以上模拟代码可以看出:

  • 我们使用Princess类和它的三个子类作为描述公主的类;
  • 使用PrincessBuilder和它的三个子类类来创建公主;
  • 使用PrincessDirector来完成公主的穿衣动作;

也就是:

建造者(Builder)模式

建造者(Builder)模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
PrincessBuilder类就是对象的构建,Princess类是对象的表示。

建造者模式包含四种角色:
a)Builder(抽象构建器):这里指PrincessBuilder。
b)ConcreteBuilder(具体构建器):这里指EnglandPrincessBulider、ChinesePrincessBulider、AmericanPrincessBulider类。
c)Product(产品):这里指EnglandPrincess、EnglandPrincess、EnglandPrincess。
d)Director(指挥者):PrincessDirector类。

在这里插入图片描述
适用于以下情况:
1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2)当构造过程必须允许被构造的对象有不同的表示时。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值