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;
}
相关推荐
virus59456 小时前
悟空CRM mybatis-3.5.3-mapper.dtd错误解决方案
java·开发语言·mybatis
一匹电信狗7 小时前
【LeetCode_547_990】并查集的应用——省份数量 + 等式方程的可满足性
c++·算法·leetcode·职场和发展·stl
Queenie_Charlie7 小时前
小陶的疑惑2
数据结构·c++·树状数组
没差c8 小时前
springboot集成flyway
java·spring boot·后端
时艰.8 小时前
Java 并发编程之 CAS 与 Atomic 原子操作类
java·开发语言
编程彩机8 小时前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂
笨蛋不要掉眼泪8 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
Yvonne爱编码9 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
Queenie_Charlie9 小时前
小陶与杠铃片
数据结构·c++·树状数组
CoderCodingNo9 小时前
【GESP】C++四级/五级练习题 luogu-P1223 排队接水
开发语言·c++·算法