生成器模式

一、什么是生成器模式

1. 使用相同的创建代码生成不同类型和形式的对象。

读起来有点拗口对吧,其实就是说给创建对象提供一个统一对入口,你不用去管内部发生了什么,只需要提取你所需要对结果。
举个例子,你现在需要创建一个房子对象,假设第一栋房子需要四面墙和地板、门和窗,但是第二栋房子在次基础之上额外需要天然气、水、电等,按正常等逻辑我们是可以在前者基础上拓展基类,但是每新增一种房型就需要新增一个子类,要是新增一个参数那就更加麻烦了。还有一个比较简单等实现就是在房屋类上写一个涵盖所有属性等构造函数,但是对于绝大部分情况而言,很多参数都是不需要使用的,这样就会造成构造函数的臃肿。
这个时候就可以使用生成器模式了。

二、怎么实现生成器模式

1. 将对象构造代码从产品类中抽取出来, 并将其放在一个名为生成器的独立对象中。

还是拿上面的例子来说,生成器模式可以将建造房子对象拆分成一组步骤,每次创建对象时, 你都需要通过生成器对象执行一系列步骤。 重点在于你无需调用所有步骤, 而只需调用创建特定对象配置所需的那些步骤即可。

当你需要创建不同形式的产品时, 其中的一些构造步骤可能需要不同的实现。 例如, 木屋的房门可能需要使用木头制造, 而城堡的房门则必须使用石头制造。
在这种情况下, 你可以创建多个不同的生成器, 用不同方式实现一组相同的创建步骤。 然后你就可以在创建过程中使用这些生成器 (例如按顺序调用多个构造步骤) 来生成不同类型的对象。

2. 生成器模式中的主管。

你可以进一步将用于创建产品的一系列生成器步骤调用抽取成为单独的主管类。 主管类可定义创建步骤的执行顺序, 而生成器则提供这些步骤的实现。
对于客户端代码来说, 主管类完全隐藏了产品构造细节。 客户端只需要将一个生成器与主管类关联, 然后使用主管类来构造产品, 就能从生成器处获得构造结果了。
主管类不是必须的,取决与开发者自身。

三、生成器模式结构

  1. 生成器 (Builder) 接口声明在所有类型生成器中通用的产品构造步骤。
  2. 具体生成器 (Concrete Builders) 提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。
  3. 产品 (Products) 是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。
  4. 主管 (Director) 类定义调用构造步骤的顺序, 这样你就可以创建和复用特定的产品配置。
  5. 客户端 (Client) 必须将某个生成器对象与主管类关联。 一般情况下, 你只需通过主管类构造函数的参数进行一次性关联即可。 此后主管类就能使用生成器对象完成后续所有的构造任务。 但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。 在这种情况下, 你在使用主管类生产产品时每次都可以使用不同的生成器。

四、生成器模式适合应用场景

1.使用生成器模式可避免 “重叠构造函数)” 的出现。

也就是上文所说的一个构造函数涵盖全部的属性行为

2.创建不同形式的产品

如果你需要创建的各种形式的产品, 它们的制造过程相似且仅有细节上的差异, 此时可使用生成器模式。

3.使用生成器构造组合树或其他复杂对象

生成器模式让你能分步骤构造产品。 你可以延迟执行某些步骤而不会影响最终产品。 你甚至可以递归调用这些步骤, 这在创建对象树时非常方便。

五、生成器模式优缺点

优点
  • 分步创建对象, 暂缓创建步骤或递归运行创建步骤。
  • 生成不同形式的产品时,复用相同的制造代码。
  • 单一职责原则。 将复杂构造代码从产品的业务逻辑中分离出来。
缺点
  • 由于该模式需要新增多个类, 因此代码整体复杂程度会有所增加。

六、伪代码

一条小咸鱼