下面关于生成器模式的例子演示了你可以如何复用相同的对象构造代码来生成不同类型的产品——例如汽车(Car)——及其相应的使用手册(Manual)。
分步骤制造汽车并制作对应型号用户使用手册的示例
汽车是一个复杂对象,有数百种不同的制造方法。我们没有在汽车类中塞入一个巨型构造函数,而是将汽车组装代码抽取到单独的汽车生成器类中。该类中有一组方法可用来配置汽车的各种部件。
如果客户端代码需要组装一辆与众不同、精心调教的汽车,它可以直接调用生成器。或者,客户端可以将组装工作委托给主管类,因为主管类知道如何使用生成器制造最受欢迎的几种型号汽车。
你或许会感到吃惊,但确实每辆汽车都需要一本使用手册(说真的,谁会去读它们呢?)。使用手册会介绍汽车的每一项功能,因此不同型号的汽车,其使用手册内容也不一样。因此,你可以复用现有流程来制造实际的汽车及其对应的手册。当然,编写手册和制造汽车不是一回事,所以我们需要另外一个生成器对象来专门编写使用手册。该类与其制造汽车的兄弟类都实现了相同的制造方法,但是其功能不是制造汽车部件,而是描述每个部件。将这些生成器传递给相同的主管对象,我们就能够生成一辆汽车或是一本使用手册了。
最后一个部分是获取结果对象。尽管金属汽车和纸质手册存在关联,但它们却是完全不同的东西。我们无法在主管类和具体产品类不发生耦合的情况下,在主管类中提供获取结果对象的方法。因此,我们只能通过负责制造过程的生成器来获取结果对象。
// 只有当产品较为复杂且需要详细配置时,使用生成器模式才有意义。