设计模式之建造者模式(C++)

建造者模式将复杂对象的构建与表示分离,允许创建不同表示。Director根据用户需求构建Product,适用于对象构建顺序稳定但内部构造变化复杂的情况。与模板方法模式相似,但侧重点不同:建造者模式关注Director带来的不同呈现,模板方法关注步骤实现。建造者模式通过组合实现,模板方法用继承。此模式用于执行不同算法或构建对象,实际编程不局限于特定设计模式,关键在于程序的高效、稳定、易扩展和维护。

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

设计模式之建造者模式

建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

其UML图如下:
建造者模式UML图
简单理解就是Builder中定义了创建Product各个部分的接口。ConcreteBuilder中具体实现了创建Product中的各个部分的接口,就是具体的建造者。Director是根据用户的需求构建Product的(具体怎么构建,怎么把Product中的各个部件构建起来。)该模式主要用于创建一些复杂的对象,这些兑现内部构建的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。

说到这里建造者模式具体实现的功能与模板方法模式有点类似。比如可以有不同得ConcreteBuilder类实现不同得创建方式。这样从应用上模板方法模式和建造者模式实现的功能是很相似的。但是建造者模式的侧重点是在于Director的不同,可以有不同的呈现方式,而模板方法模式的侧重点是算法中每一步实现的不同。另外,它们的类之间的关系是不同的。模板方法是通过继承的方式来实现的,而建造者模式是通过组合的方式实现的。模板方法模式主要用于执行不同的算法,建造者模式主要用于构建对象。不过者两种模式其实都可以实现很多相似的功能。这也没什么,本来同样的功能的实现方式也是多种多样的。主要看需求。另外在实际写程序的时候也不必拘泥于某种设计模式,只要遵守相关的原则,使整个程序高效、稳定、易扩展、易维护就行。两者使用的场景也有区别。其示例代码如下:

// BuilderModel.h文件
#pragma once
#include <iostream>
#include <vector>
#include <string>

// 产品类
class Product
{
public:
	void Add(std::string str)
	{
		m_vec.push_back(str);
	}
	void Show()
	{
		for (auto it = m_vec.cbegin(); it != m_vec.cend(); it++)
		{
			std::cout << *it << std::endl;
		}
	}
private:
	std::vector<std::string> m_vec;
};
// 建造者类
class Builder
{
public:
	virtual void BuildPartA() = 0;
	virtual void BuildPartB() = 0;
	virtual void BuildPartC() = 0;
	virtual Product getResult() = 0;
};

class ConcreteBuilder_0 : public Builder
{
public:
	ConcreteBuilder_0() : m_p(nullptr)
	{
		m_p = new Product();
	}
	virtual ~ConcreteBuilder_0()
	{
		if (nullptr == m_p)
			delete m_p;
	}
	virtual void BuildPartA()
	{
		std::string str = "Builder_0 BuildPartA";
		m_p->Add(str);
	}
	virtual void BuildPartB()
	{
		std::string str = "Builder_0 BuildPartB";
		m_p->Add(str);
	}
	virtual void BuildPartC()
	{
		std::string str = "Builder_0 BuildPartC";
		m_p->Add(str);
	}
	Product getResult()
	{
		return *m_p;
	}
private:
	Product * m_p;
};

class ConcreteBuilder_1 : public Builder
{
public:
	ConcreteBuilder_1() : m_p(nullptr)
	{
		m_p = new Product();
	}
	virtual ~ConcreteBuilder_1()
	{
		if (nullptr == m_p)
			delete m_p;
	}
	virtual void BuildPartA()
	{
		std::string str = "Builder_1 BuildPartA";
		m_p->Add(str);
	}
	virtual void BuildPartB()
	{
		std::string str = "Builder_1 BuildPartB";
		m_p->Add(str);
	}
	virtual void BuildPartC()
	{
		std::string str = "Builder_1 BuildPartC";
		m_p->Add(str);
	}
	Product getResult()
	{
		return *m_p;
	}
private:
	Product * m_p;
};
// 指挥者类
class Director
{
public:
	// 具体怎么实现根据需求
	void build(Builder *p)
	{
		p->BuildPartA();
		p->BuildPartC();
		p->BuildPartB();
	}
};

测试代码如下:

#include <iostream>
#include "BuilderModel.h"

int main()
{
	using namespace std;
	// 建造者模式
	Builder *builder= new ConcreteBuilder_0();
	Director * director = new Director();
	director->build(builder);
	builder->getResult().Show();

	delete builder;
	builder = new ConcreteBuilder_1();
	director->build(builder);
	builder->getResult().Show();
	getchar();
	return 0;
}

测试结果如下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值