一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情
前言
- 万丈高楼平地起,代码中尤其是Java语言中对象的创建并没有很强的管理,在初级程序员中很常见的就是new对象。每一个对象都是在内存中开空间的。如果必须的对象哪肯定是需要存在的,就怕同一个对象new了很多造成对内存的浪费。
- 假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。 这些初始化代码通常深藏于一个包含众多参数且让人基本看不懂的构造函数中; 甚至还有更糟糕的情况, 那就是这些代码散落在客户端代码的多个位置。 生成器模式建议将对象构造代码从产品类中抽取出来, 并将其放在一个名为生成器的独立对象中。
场景
在本例中, 生成器模式允许你分步骤地制造不同型号的汽车。
示例还展示了生成器如何使用相同的生产过程制造不同类型的产品 (汽车手册)。
主管控制着构造顺序。 它知道制造各种汽车型号需要调用的生产步骤。 它仅与汽车的通用接口进行交互。 这样就能将不同类型的生成器传递给主管了。
最终结果将从生成器对象中获得, 因为主管不知道最终产品的类型。 只有生成器对象知道自己生成的产品是什么。
区别
- 在许多设计工作的初期都会使用工厂方法模式, 随后演化为使用抽象工厂模式 原型模式或生成器模式(更灵活但更加复杂)。
- [生成器]重点关注如何分步生成复杂对象。 [抽象工厂]专门用于生产一系列相关对象。 抽象工厂会马上返回产品, 生成器则允许你在获取产品前执行一些额外构造步骤。
- 你可以在创建复杂组合模式树时使用生成器, 因为这可使其构造步骤以递归的方式运行。
- 你可以结合使用[生成器]和[桥接模式]: 主管类负责抽象工作, 各种不同的生成器负责实现工作。
- [抽象工厂]、 生成器和原型都可以用[单例模式]来实现。
总结
- 使用生成器模式可避免 “重叠构造函数 (telescopic constructor)” 的出现。
- 当你希望使用代码创建不同形式的产品 (例如石头或木头房屋) 时, 可使用生成器模式。
- 使用生成器构造组合树或其他复杂对象。