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;
}
相关推荐
码匠许师傅7 小时前
【C++ 面试真题】C++ 的 const 和 constexpr 有什么区别?
c++·面试
码农颜9 小时前
5.4.1 锁分类
java·数据库·mysql
果果燕10 小时前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git
牛艺翔10 小时前
C++基础
开发语言·c++
键盘会跳舞10 小时前
C++ :容器适配器stack源码级拆解
开发语言·c++··stack·先进后出
linux-hzh10 小时前
百日算法修炼 · Day 03
java·算法
不负岁月无痕11 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试
mister_guo11 小时前
Java线程池参数应该如何设置(ThreadPoolExecutor)
java
余额瞒着我当琳11 小时前
C++模板初阶与STL初探
android·java·c++
淡海水11 小时前
15-02-YooAsset面试篇-Unity架构设计与源码
java·unity·面试·c#·游戏引擎·yooasset