设计模式-创建型模式之 Builder(生成器)

本文深入探讨了构造器与表示分离的概念,通过Builder模式实例展示了如何将一个复杂对象的构建与它的表示分离,实现构造代码与表示代码的解耦,以及如何对构造过程进行更精细的控制。同时,对比了Builder模式与AbstractFactory模式的应用场景,提供了具体的代码实现和效果分析。
摘要由CSDN通过智能技术生成

意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Product  //一个被构造的复杂对象,是一个包含组件的类
{
private:
	vector<string> Part;
public:
	void AddPartA(string PartName)
	{
		Part.push_back(PartName);
	}
   
	void AddPartB(string PartName)
	{
		Part.push_back(PartName);
	}

	void Show()
	{
		for( vector<string>::iterator i = Part.begin();i != Part.end(); i++)
		{
			cout << *i << "   ";
		}
		cout << "construct finished";
	}
};

class Builder  //生成器,为创建一个Product对象的各个部件指定抽象接口,与Abstrct Factory类似,也使用了工厂方法
{
public:Product product;   
public:
	virtual void AddPart() = 0;
	virtual Product& Return() = 0;
};
	
class ConcretBuilder1:public Builder  //创建具体产品的内部表示并定义它的装配流程
{
public:
	void AddPart()
	{
		product.AddPartA(string("Product1PartA"));
		product.AddPartB(string("Product1PartB"));
	}

	Product& Return()
	{
		return this->product;
	}
};

class ConcretBuilder2:public Builder
{
public:
	void AddPart()
	{
		product.AddPartA(string("Product2PartA"));
		product.AddPartB(string("Product2PartB"));
	}

	Product& Return()
	{
		return this->product;
	}
};

class Director  //导向器,构造一个使用Builder接口的对象
{
public:
	Product& Construct(Builder* builder)
	{
		builder->AddPart();
		return builder->Return();
    }
};

int main()
{
	Director* director = new Director();
	Builder* builder1 = new ConcretBuilder2();
	Product product = director->Construct(builder1);
	product.Show();
	
	delete director;
	delete builder1;
	return 1;
}

效果:

1 使得可以改变一个产品的内部表示

2 使得构造代码和表示代码分开

3 使得可以对构造过程进行更精细的控制


相关模式:

1 Abstract Factory与Builder相似,它们都使用了工厂方法,都可以创建复杂对象,主要区别在于Builder着重于一步步构造一个复杂对象,而Abstract Factory着重于多个系列的产品对象;Builder在最后一步返回产品,而Abstract Factory的产品是立即返回的

2 Composite通常是Builder生成的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值