学习设计模式: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;
}

相关模式

  • Abstract Factory 和 Builder 相似,因为它也可以创建复杂对象。区别是 Builder 着重于一步步构造一个复杂对象。而 Abstract Factory 着重于多个系列的产品对象(或简单或复杂)。Builder 是在最后一步返回产品,Abstract Factory 是立即返回。
  • Composite 通常是用 Builder 生成的。

参照

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

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

上一篇:在虚拟机CentOs7安装ElasticSearch-7.12.0


下一篇:c++ builder 线程池