C++设计模式——构建者模式(Build)

构建者模式

主要是将一个复杂对象的构建和表示分离(类似模板方法模式)。
直接上代码:

#pragma once
#include<iostream>
#include<string>
using namespace std;
class House {
public:
	virtual void setWall(const string& str) = 0;
	virtual void setWindow(const string& str) = 0;
	virtual void setDoor(const string& str) = 0;
	virtual void setRoom(const string& str) = 0;
	virtual void show() = 0;
	virtual ~House() {}

	string wall, Window, door, room;
};
class HouseBuild {
public:
	virtual House* GetResult() = 0;

	virtual void BuildWall() = 0;
	virtual void BuildWindow() = 0;
	virtual void BuildDoor() = 0;
	virtual void BuildRoom() = 0;

	virtual ~HouseBuild() {}
};


class StoneHouse :public House {
public:
	void setWall(const string& str) override{
		this->wall = str;
	}
	void setWindow(const string& str) override {
		this->Window = str;
	}
	void setDoor(const string& str) override {
		this->door = str;
	}
	void setRoom(const string& str) override {
		this->room = str;
	}
	void show()override {
		cout << "Stone House data:" << "wall=" << wall << ",  window=" 
			<< Window << ",  door=" << door << ",  room=" <<room<< endl;
	}
};


class StoneHouseBuild :public HouseBuild {
public:
	StoneHouseBuild(StoneHouse* pStoneHouse) {
		this->pStoneHouse = pStoneHouse;
	}

	void BuildWall() override{
		cout << "Stone Wall" << endl;
		pStoneHouse->setWall("Stonewall");
	}
	void BuildWindow() override {
		cout << "Stone Window" << endl;
		pStoneHouse->setWindow("Stonewindow");
	}
	void BuildDoor() override {
		cout << "Stone Door" << endl;
		pStoneHouse->setDoor("Stonedoor");
	}
	void BuildRoom() override {
		cout << "Stone Room" << endl;
		pStoneHouse->setRoom("Stoneroom");
	}
	House* GetResult()override {
		return pStoneHouse;
	}
	~StoneHouseBuild() {
		delete pStoneHouse;
		this->pStoneHouse = nullptr;
	}
private:
	StoneHouse* pStoneHouse;
};


class WoodHouse :public House {
public:
	void setWall(const string& str) override {
		this->wall = str;
	}
	void setWindow(const string& str) override {
		this->Window = str;
	}
	void setDoor(const string& str) override {
		this->door = str;
	}
	void setRoom(const string& str) override {
		this->room = str;
	}
	void show()override {
		cout << "Wood House data:" << "wall=" << wall << ",  window=" 
			<< Window << ",  door=" << door << ",  room=" <<room<< endl;
	}
};
class WoodHouseBuild :public HouseBuild {
public:
	WoodHouseBuild(WoodHouse* pWoodHouse) {
		this->pWoodHouse = pWoodHouse;
	}

	void BuildWall() override {
		cout << "Wood Wall" << endl;
		pWoodHouse->setWall("Woodwall");
	}
	void BuildWindow() override {
		cout << "Wood Window" << endl;
		pWoodHouse->setWindow("Woodwindow");
	}
	void BuildDoor() override {
		cout << "Wood Door" << endl;
		pWoodHouse->setDoor("Wooddoor");
	}
	void BuildRoom() override {
		cout << "Wood Room" << endl;
		pWoodHouse->setRoom("Woodroom");
	}
	House* GetResult()override {
		return pWoodHouse;
	}
	~WoodHouseBuild() {
		delete pWoodHouse;
		this->pWoodHouse = nullptr;
	}
private:
	WoodHouse* pWoodHouse;
};

Build.h。在这里,以建房子为例。其中建房子的顺序是一致的,都是Wall、Window、Door、Room,这部分是固定的,因此把该部分整体抽出来在另一个抽象基类HouseBuild中执行,实现分离。每种类型的房子都继承自抽象基类House,对应的建房子算法继承自抽象基类HouseBuild。

#include<iostream>
#include"Build.h"
using namespace std;

class HouseDirector {
public:
	HouseBuild* pHouseBuild;
	HouseDirector(HouseBuild* pHouseBuild){
		this->pHouseBuild = pHouseBuild;
	}

	//流程一样,稳定的
	House* Construct() {
		pHouseBuild->BuildWall();
		pHouseBuild->BuildWindow();
		pHouseBuild->BuildDoor();
		pHouseBuild->BuildRoom();

		return pHouseBuild->GetResult();
	}

	~HouseDirector() {
		delete pHouseBuild;
		this->pHouseBuild = nullptr;
	}
};

int main()
{
	HouseBuild* pHouse1 = new StoneHouseBuild(new StoneHouse());
	HouseDirector* director1 = new HouseDirector(pHouse1);
	director1->Construct()->show();
	cout << "===========" << endl;

	HouseBuild* pHouse2 = new WoodHouseBuild(new WoodHouse());
	HouseDirector* director2 = new HouseDirector(pHouse2);
	director2->Construct()->show();

	return 0;
}

Build.cpp。其中Construct方法就是稳定不变的。这样就实现了构建和表示的分离。

实验结果如下:
在这里插入图片描述

Borland C++ Builder 6 (汉化补丁终结版) 汉化说明 ======================================================= 欢迎使用剑客软件,您的支持是我们前进的不懈动力。 ------------------------------------------------------------------------- 软件名称: Borland C++ Builder 6.0 (汉化补丁终结版) 软件版本: 6.0 (Build 10.166 , Update 4) 授权形式: 免费 作品类型: 汉化补丁 应用平台: Win9x/Me/NT/2000/XP/2003 软件作者: 辛玉强 作者主页: Http://swordxy.126.com 作者邮件: xy_0717@163.com ------------------------------------------------------------------------- 软件简介: Borland C++ Builder 是目前唯一完美集成 COBRA 与 COM/COM+ 的 C++ 集成开发环境,可以快速开发具有 Web 服务支持功能的电子商务应用程序,全球率先实现跨平台、高效可视化开发 Windows/Linux 应用程序,兼容 CLX、VCL 和 Borland C++ for Linux,增强了对于 Microsoft Visual C++ 源程序的兼容程度,提供 MFC 6.0 版与 ATL 3.0 版函数库,比起 Visual C++ 的 MFC 来,VCL 要先进得多。 ------------------------------------------------------------------------- 新增功能: 在 Borland C++Builder 6 汉化补丁增强版 的基础上,进一步修正了 Borland 的图片及资源编辑器、SQL 监视器的一些小的翻译问题,力争翻译的更贴切。同时, 增加了对 Borland SQL 浏览器 、桌面数据库 、BDE 管理员 的汉化支持。 让您的 C++ Builder 更符合国人的习惯。 另外又新增加了安装时自选组件的功能, 您可以根据自己的需要来决定哪些组件需要汉化,定制属于您自己的开发环境。 最后,加入了一些其他的文件关联方式,如: C 、HPP 、DCR 、RES 、PAS 等等,便于您直接拿记事本来修改 C++ 的源文件而不用开启 C++Builder ,对于小范围的修改代码比较方便。 ------------------------------------------------------------------------- 汉化方法: 汉化前请确认 C++ Builder 6.0 及其相关程序程序没有运行,否则强行汉化可能会损坏文件。 下载后解压缩 RAR,运行 BCBswordH6.exe 将文件安装到原英文 BCB.exe 所在的目录 (一般为: C:\Program Files\Borland\CBuilder6\Bin) 即可使用。 如果您希望以后还能继续使用英文版, 请注意选择备份旧的文件,并注意在卸载本汉化补丁时选择 "反转" 以恢复英文版 (如果您不创建文件备份,卸载本汉化补丁时将不能恢复英文版,并且您需要重新安装 Borland C++ Builder 6.0 以恢复英文版)。 ------------------------------------------------------------------------- 郑重声明:  1.此软件原始版本版权归 Borland 公司所有,本人仅在原始软件基础上进行简体中文本地化。  2.感谢您使用 swordxy 的汉化作品。本人所有汉化作品均为免费发放,任何组织或个人未经本人允许,不得将本人的汉化作品用于商业活动或任何其它赢利性活动中。  3.本人的汉化只为使用方便而做,使用 swordxy 的汉化作品是您的自由选择,本人并不对由此给您的计算机系统带来的任何问题负责。  4.欢迎转载、传播 swordxy 的所有汉化作品。但请注意在转载或传播过程中保持汉化文件的完整性。请勿删除此说明文件并请尽量少改动汉化文件名。如果直接链接本站下载链接,请在下载位置注明出处。  5.在使用过程中如果发现翻译错误之处请及时来信指出。 6.如果确系因使用本软件导致软件运行不正常或系统不稳定(请先确认该问题是否原版软件已经存在), swordxy 并不能提供任何补偿或补救措施,swordxy 只能在纯学术研究的前提下,在获知具体出错现象后,尽可能的给与私人的友情帮助。 7.请勿向 swordxy 询问任何软件注册破解问题,对此类问题本人概不答复,软件使用中如有任何疑问,请发邮件到 xy_0717@163.com,但本人不保证一定能够解答。 -------------------------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dailingGuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值