生成器模式
最后更新于:2022-04-02 04:19:07
[TOC]
## 概述
亦称:建造者模式、Builder
**生成器模式**是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 ## 使用场景 如房子可以配备很多设施,但是并非所有设施都是必须. ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/91/9d/919db1b44e3d4eb1d72179a7244eeb31_1200x700.png) >[danger] 对于构造函数的调用十分不简洁 ## 解决方案 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/ca/4d/ca4d6b4afe624d006a985bcfcd48faf1_820x560.png) ## 生成器模式结构 1. **生成器 (Builder)** 接口声明在所有类型生成器中通用的产品构造步骤。 2. **具体生成器 (Concrete Builders)** 提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。 3. **产品 (Products)** 是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。 4. **主管 (Director)** 类定义调用构造步骤的顺序, 这样你就可以创建和复用特定的产品配置。 5. **客户端 (Client)** 必须将某个生成器对象与主管类关联。 一般情况下, 你只需通过主管类构造函数的参数进行一次性关联即可。 此后主管类就能使用生成器对象完成后续所有的构造任务。 但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。 在这种情况下, 你在使用主管类生产产品时每次都可以使用不同的生成器。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/ee/be/eebe675b7ed0d040075bb9cf6ee52641_920x1160.png) 伪代码 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/68/8b/688b97f44878178677a2f349f870b91f_1000x1180.png) ## 生成器模式适合应用场景 - 使用生成器模式可避免 “重叠构造函数 (telescopic constructor)” 的出现。 ``` // 重叠构造函数就是构造函数重载 class Pizza { Pizza(int size) { ... } Pizza(int size, boolean cheese) { ... } Pizza(int size, boolean cheese, boolean pepperoni) { ... } ``` - 当你希望使用代码创建不同形式的产品 (例如石头或木头房屋) 时, 可使用生成器模式 - 使用生成器构造组合树或其他复杂对象。 ## 与其他模式的关系 - 在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式或生成器模式 (更灵活但更加复杂)。 - 生成器重点关注如何分步生成复杂对象。 抽象工厂专门用于生产一系列相关对象。 抽象工厂会马上返回产品, 生成器则允许你在获取产品前执行一些额外构造步骤。 - 你可以在创建复杂组合模式树时使用生成器, 因为这可使其构造步骤以递归的方式运行。 - 你可以结合使用生成器和桥接模式: 主管类负责抽象工作, 各种不同的生成器负责实现工作。 - 抽象工厂、 生成器和原型都可以用单例模式来实现。
';
**生成器模式**是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 ## 使用场景 如房子可以配备很多设施,但是并非所有设施都是必须. ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/91/9d/919db1b44e3d4eb1d72179a7244eeb31_1200x700.png) >[danger] 对于构造函数的调用十分不简洁 ## 解决方案 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/ca/4d/ca4d6b4afe624d006a985bcfcd48faf1_820x560.png) ## 生成器模式结构 1. **生成器 (Builder)** 接口声明在所有类型生成器中通用的产品构造步骤。 2. **具体生成器 (Concrete Builders)** 提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。 3. **产品 (Products)** 是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。 4. **主管 (Director)** 类定义调用构造步骤的顺序, 这样你就可以创建和复用特定的产品配置。 5. **客户端 (Client)** 必须将某个生成器对象与主管类关联。 一般情况下, 你只需通过主管类构造函数的参数进行一次性关联即可。 此后主管类就能使用生成器对象完成后续所有的构造任务。 但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。 在这种情况下, 你在使用主管类生产产品时每次都可以使用不同的生成器。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/ee/be/eebe675b7ed0d040075bb9cf6ee52641_920x1160.png) 伪代码 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/68/8b/688b97f44878178677a2f349f870b91f_1000x1180.png) ## 生成器模式适合应用场景 - 使用生成器模式可避免 “重叠构造函数 (telescopic constructor)” 的出现。 ``` // 重叠构造函数就是构造函数重载 class Pizza { Pizza(int size) { ... } Pizza(int size, boolean cheese) { ... } Pizza(int size, boolean cheese, boolean pepperoni) { ... } ``` - 当你希望使用代码创建不同形式的产品 (例如石头或木头房屋) 时, 可使用生成器模式 - 使用生成器构造组合树或其他复杂对象。 ## 与其他模式的关系 - 在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式或生成器模式 (更灵活但更加复杂)。 - 生成器重点关注如何分步生成复杂对象。 抽象工厂专门用于生产一系列相关对象。 抽象工厂会马上返回产品, 生成器则允许你在获取产品前执行一些额外构造步骤。 - 你可以在创建复杂组合模式树时使用生成器, 因为这可使其构造步骤以递归的方式运行。 - 你可以结合使用生成器和桥接模式: 主管类负责抽象工作, 各种不同的生成器负责实现工作。 - 抽象工厂、 生成器和原型都可以用单例模式来实现。