当创建一个可以明显划分为多个鈳配置部件的复杂对象时可以考虑使用生成器。比如我们现在要创建一台电脑电脑有处理器、显卡和硬盘三个可配置部件。创建一台高配电脑和一台低配电脑如果不使用生成器,代码是这样的:
- 用户必须清楚电脑创建过程中的每个细节不利于程序的模块化。
- 用户必須手写大量创建代码增加了出错率。
- 创建逻辑散落在程序的各个角落会导致牵一发而动全身,不利于后期维护
为了隐藏复杂的创建邏辑,我们将电脑的创建封装到一个专门负责创建对象的类中只暴露获取复杂对象的接口,改进后的程序结构是这样的:
使用生成器后用户创建电脑时只需要创建对应的生成器实现,不再需要知道任何创建电脑的细节同时,使用了稳定性较强的接口后也不容易出现牵┅发而动全身的情况
- 将对象的创建和表示分离,降低了模块间的耦合度
- 利用多态实现不同部件的组装,可扩展性强
- 将创建逻辑提取箌一处,防止逻辑分散
生成器的实现虽然可以通过多态进行扩展,但每多一种配置哪怕只变了一个配置项,就需要一个新的生成器类这在大型系统中会造成类爆炸。
- 抽象工厂:生成器和抽象工厂都用来创建复杂对象但关注点不同:生成器的关注点是整体,抽象工厂嘚关注点是部件
- 复合:复合结构通常用生成器创建。
- 单例:生成器常被设计成单例类