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;
}
相关推荐
贫民窟的勇敢爷们19 小时前
SpringBoot整合AOP切面编程实战,实现日志统一记录+接口权限校验
java·spring boot·spring
AC赳赳老秦20 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
迈巴赫车主20 小时前
Java基础:list、set、map一遍过
java·开发语言
智者知已应修善业20 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
灵犀学长20 小时前
基于 Spring ThreadPoolTaskScheduler + CronTrigger 实现的动态定时任务调度系统
java·数据库·spring
好家伙VCC1 天前
【无标题】
java
小碗羊肉1 天前
【JavaWeb | 第十一篇】文件上传(本地&阿里云OSS)
java·阿里云·servlet
吾疾唯君医1 天前
Java SpringBoot集成积木报表实操记录
java·spring boot·spring·导出excel·积木报表·数据文件下载
Byron Loong1 天前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
坚果派·白晓明1 天前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库