建造者模式
概述
建造者模式是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象
问题
假设有一个复杂对象,在其构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作,通常情况下会使代码十分不简洁
解决方案
- 建造者模式建议将对象构造代码从产品类中抽取出来,并将其放在一个名为生成器的独立对象中
- 每次创建对象时,你都需要通过生成器对象执行一系列步骤。重点在于你无需调用所有步骤,而只需要调用特定对象配置所需的那些步骤即可
- 在这种情况下,你可以创建多个不同的生成器,用不同的方式实现一组相同的创建步骤,然后你就可以在创建过程中使用这些构造器来生成不同类型的对象
你可以进一步将用于创建产品的一系列生成器步骤调用抽取成为单独的主管类,主管类可定义创建步骤的执行顺序,而生成器则提供这些步骤的实现
建造者模式适合应用场景
-
使用建造器模式可避免”重叠构造函数“的出现
假如你的构造函数有十个可选参数,那么调用该函数会非常不方便
class Pizza { Pizza(int size) { ... } Pizza(int size, boolean cheese) { ... } Pizza(int size, boolean cheese, boolean pepperoni) { ... } // ...建造者模式可以让你分步骤生成对象,而且允许你仅使用必须的步骤
-
当你希望使用代码创建不同形式的产品时,可使用建造者模式
如果你需要创建的各种形式的产品,它们的制造过程相似且仅有细节上的差异,此时可以使用建造者模式
基本生成器接口中定义了所有可能的建造步骤,具体生成器将实现这些步骤来制造特定形式的产品。同时,主管类将负责管理制造步骤的顺序
-
使用生成器构造组合树或其他复杂对象
生成器模式让你能分步骤构造产品,这使得创建对象非常方便
生成器在执行制造步骤时,不能对外发布未完成的产品
实现方法
- 清晰定义通用步骤,确保它们可以制造所有形式的产品
- 在基本生成器接口中声明这些步骤
- 为每个形式的产品创建具体生成器,并实现其构造步骤
- 考虑创建主管类。它可以使用同一生成器对象来封装多种构造产品的方式
- 客户端代码会同时创建生成器和主管对象
- 只有在所有产品都遵循相同接口的情况下,构造结果可以直接通过主管类获取
建造者模式的优缺点
优点
- 你可以分布创建对象,暂缓创建步骤或递归运行创建步骤
- 生成不同形式的代码时,你可以复用相同的制造代码
- 单一职责原则
缺点
- 由于该模式需要新增多个类,因此代码整体复杂程度会有所增加