c++实现建造者模式

代码

director.h

cpp 复制代码
#pragma once
#include<vector>
#include<string>
#include<iostream>

class Product
{
private:
	std::vector<std::string> _parts;

public:
	void Add(const std::string& part) {
		_parts.push_back(part);
	}

	void show()
	{
		std::cout << "product produce----" << std::endl;
		for (auto item : _parts) {
			std::cout << item << std::endl;
		}
		std::cout << std::endl;
	}
};

class Builder
{
public:
	virtual void buildPartA() = 0;
	virtual void buildPartB() = 0;
	virtual Product* getResult() = 0;
};

class ConcreteBuilder1 : public Builder
{
private:
	Product* _pProduct;

public:
	ConcreteBuilder1() {
		_pProduct = new Product();
	}
	~ConcreteBuilder1() {
		delete _pProduct;
	}

	void buildPartA() override
	{
		_pProduct->Add("部件a");
	}

	void buildPartB() override
	{
		_pProduct->Add("部件b");
	}

	// 小心使用。如果该类的对象被析构,得到的指针将为空。
	Product* getResult() override
	{
		if (_pProduct != nullptr) {
			return _pProduct;
		}
		else {
			return nullptr;
		}
	}
};

class ConcreteBuilder2 : public Builder
{
private:
	Product* _pProduct;

public:
	ConcreteBuilder2() {
		_pProduct = new Product();
	}
	~ConcreteBuilder2() {
		delete _pProduct;
	}

	void buildPartA() override
	{
		_pProduct->Add("部件x");
	}

	void buildPartB() override
	{
		_pProduct->Add("部件y");
	}

	// 小心使用。如果该类的对象被析构,得到的指针将为空。
	Product* getResult() override
	{
		if (_pProduct != nullptr) {
			return _pProduct;
		}
		else {
			return nullptr;
		}
	}

};


class Director
{
private:
	Builder* _pBuilder;

public:
	Director(Builder* p_builder) :_pBuilder(p_builder) {}

	void construct()
	{
		if (_pBuilder != nullptr) {
			_pBuilder->buildPartA();
			_pBuilder->buildPartB();
		}
	}
	
};

main.cpp

cpp 复制代码
#include<iostream>
#include"Director.h"



int main()
{
	Builder* pBuilder1 = new ConcreteBuilder1();

	Director* pDirector = new Director(pBuilder1);
	pDirector->construct(); // 让按builder1的方式生成产品

	Product* pProduct = pBuilder1->getResult();// 获取产品
	pProduct->show();

	Builder* pBuilder2 = new ConcreteBuilder2();
	pDirector = new Director(pBuilder2);
	pDirector->construct(); // 让按builder2的方式生成产品

	pProduct = pBuilder2->getResult(); // 获取产品
	pProduct->show();

	delete pDirector;
	delete pBuilder1;

	return 0;
}
相关推荐
遇见你的雩风2 分钟前
网络原理(一)
java·网络
952367 分钟前
Spring IoC&DI
java·数据库·spring
khalil102012 分钟前
代码随想录算法训练营Day-34动态规划03 | 01背包问题 二维、01背包问题 一维、416. 分割等和子集
数据结构·c++·算法·leetcode·动态规划·背包问题·01背包
十六年开源服务商15 分钟前
游戏与设计驱动WordPress建站2026
java·前端·游戏
前进吧-程序员20 分钟前
C++ 内存到底分配在哪?
java·jvm·c++
NWU_白杨22 分钟前
VoiceMockInterview项目MVP开发
java·ai
RDCJM26 分钟前
Springboot的jak安装与配置教程
java·spring boot·后端
呱牛do it29 分钟前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 4)
java·vue
云烟成雨TD32 分钟前
Spring AI Alibaba 1.x 系列【39】四大多智能体(Multi-agent)架构
java·人工智能·spring
Xingxing?!33 分钟前
Java 后端分层架构详解
java·架构·状态模式