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

本文通过C++代码展示了如何运用构建者模式来分离复杂对象的构建与表示。代码中,`House`作为抽象基类,`StoneHouse`和`WoodHouse`是其具体实现,而`HouseBuild`为构建过程的抽象接口,`StoneHouseBuild`和`WoodHouseBuild`则是具体的构建者。`HouseDirector`作为导演角色,负责统一建造流程。这种设计使得房屋建造的顺序固定,但具体类型可变,实现了建造过程的解耦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构建者模式

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

#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方法就是稳定不变的。这样就实现了构建和表示的分离。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dailingGuo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值