ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-02 00:01:16  阅读:194  来源: 互联网

标签:... Product 对象 Builder 生成器 Director 设计模式 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《设计模式:可复用面向对象软件的基础》

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有