系列文章目录
设计模式概述
创建型模式-单例模式
创建型模式-原型模式
创建型模式-工厂方法模式
创建型模式-抽象工厂模式
创建型模式-建造者模式
建造者模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
解决问题
假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。你可以选择,一,扩展该对象的各个子类,涵盖所有参数组合;二,创建一个包括所有可能参数的超级构造函数。你也可以选择把构建对象的代码从产品类中抽取出来,并将其放在一个名为建造器的独立对象中。
实现
- 清晰地定义通用步骤, 确保它们可以制造所有形式的产品。 否则你将无法进一步实施该模式。
- 在基本生成器接口中声明这些步骤。基本生成器接口中定义了所有可能的制造步骤, 具体生成器将实现这些步骤来制造特定形式的产品。
- 为每个形式的产品创建具体生成器类, 并实现其构造步骤。
不要忘记实现获取构造结果对象的方法。 你不能在生成器接口中声明该方法, 因为不同生成器构造的产品可能没有公共接口, 因此你就不知道该方法返回的对象类型。 但是, 如果所有产品都位于单一类层次中, 你就可以安全地在基本接口中添加获取生成对象的方法。 - 考虑创建主管类。 它可以使用同一生成器对象来封装多种构造产品的方式。
- 客户端代码会同时创建生成器和主管对象。 构造开始前, 客户端必须将生成器对象传递给主管对象。 通常情况下, 客户端只需调用主管类构造函数一次即可。 主管类使用生成器对象完成后续所有制造任务。 还有另一种方式, 那就是客户端可以将生成器对象直接传递给主管类的制造方法。
- 只有在所有产品都遵循相同接口的情况下, 构造结果可以直接通过主管类获取。 否则, 客户端应当通过生成器获取构造结果。
优缺点
✅ 生成不同形式的产品时, 你可以复用相同的制造代码。
✅ 你可以分步创建对象, 暂缓创建步骤或递归运行创建步骤。
✅ 单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来。
❌ 该模式需要新增多个类, 代码整体复杂程度会有所增加。
总结
由谁创建(Who) :由具体建造者创建
创建什么(What) :需要多个组成部分构成的复杂对象
何时创建(When):指挥者告诉建造者需要一个具体产品时
实践讨论
- 建造者模式,一直在强调“零件组装的顺序”。如果顺序不重要,还能用吗?
- 点播视频重试策略,现在是优先重试分辨率,然后再重试CDN厂商的。如果要按照建造者模式进行改造,该怎么做?
参考资料
- 《设计模式的艺术》作者:刘伟
- 网站:https://refactoringguru.cn/design-patterns