其他分享
首页 > 其他分享> > 学习设计模式:Builder(生成器)

学习设计模式:Builder(生成器)

作者:互联网

也叫建造者模式、构建器模式

意图

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

适用性

在以下情况下可以使用 Builder 模式:

结构

Builder:为创建一个 Product 对象的各个部件指定抽象接口。

ConcreteBuilder:实现 Builder 的接口以构造和装配该产品的各个部件;定义并明确它所创建的表示;提供一个检索产品的接口。

Director:构造一个使用 Builder 接口的对象。

Product:表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

细则

它使你可以改变一个产品的内部表示。在改变该产品的内部表示时所要做的只是定义一个新的 ConcreteBuilder。

它将构造代码和表示代码分开,提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息。

它使你可以对构造过程进行更精细的控制。对象是在 Director 的控制下一步一步构造的,仅当产品构造完成时 Director 才从 Builder 中取回它。

通常有一个抽象的 Builder 类为 Director 可能要求的每一个构件定义一个操作。这些操作缺省情况下什么都不做。一个 ConcreateBuilder 类对它有兴趣创建的构件重定义这些操作。

生成器逐步的构造它们的产品。因此 Builder 类接口必须足够普遍。

通常由生成器生成的产品相差很大以至于没有抽象父类。

(从变化点的形式上来看,生成器和模板方法有点类似,模板方法只是把接口实现延迟到子类,但是生成器还需要创建任意个不同组合的对象,比模板方法遇到的问题要多一层变化)

代码示例

#include <iostream>

class Product
{
public:
	Product() {}
	Product(const Product& other) {}
	virtual ~Product() {}
	void doA(...) {}
	void doB(...) {}
	//用原型模式来创建product实例
	Product* clone() {
		return new Product(*this);
	}
};

class Builder
{
public:
	virtual ~Builder() {}
	virtual void partA(...) {}
	virtual void partB(...) {}
	virtual Product* getResult() = 0;
};

class ConcreteBuilder1 : public Builder
{
public:
	ConcreteBuilder1() {
		product = new Product();
	}
	void partA(...) override {}
	void partB(...) override {}
	Product* getResult() {
		return product->clone();
	}
private:
	Product* product;
};

class Director
{
public:
	Director(Builder* ptr) : builder(ptr) {}
	Product* build() {
		builder->partA();
		builder->partB();
		return builder->getResult();
	}

private:
	Builder* builder;
};

int main()
{
	ConcreteBuilder1* builder = new ConcreteBuilder1();
	Director* director = new Director(builder);
	Product* product = director->build();
	// ... ...
	system("pause");
	return 0;
}

相关模式

参照

书籍:GOF《设计模式:可复用面向对象软件的基础》

视频:李建忠设计模式(版权问题,自行搜索)

标签:...,Product,对象,Builder,生成器,Director,设计模式,builder
来源: https://blog.csdn.net/gongjianbo1992/article/details/122272076