意图
构造者模式(建造者模式、生成器模式)是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
问题
假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。 这些初始化代码通常深藏于一个包含众多参数且让人基本看不懂的构造函数中; 甚至还有更糟糕的情况, 那就是这些代码散落在客户端代码的多个位置。
例如, 我们来思考如何创建一个 房屋House对象。 建造一栋简单的房屋, 首先你需要建造四面墙和地板, 安装房门和一套窗户, 然后再建造一个屋顶。 但是如果你想要一栋更宽敞更明亮的房屋, 还要有院子和其他设施 (例如暖气、 排水和供电设备), 那又该怎么办呢?
1)扩展房屋基类, 然后创建一系列涵盖所有参数组合的子类。 但最终你将面对相当数量的子类。 任何新增的参数 (例如门廊类型) 都会让这个层次结构更加复杂。
2)无需生成子类。 你可以在房屋基类中创建一个包括所有可能参数的超级构造函数, 并用它来控制房屋对象。 这种方法确实可以避免生成子类, 但它却会造成另外一个问题—>拥有大量输入参数的构造函数也有缺陷: 这些参数也不是每次都要全部用上的。对于构造函数的调用十分不简洁。
解决方案
建造者模式结构图:
抽象构造者:构造者模式建议将对象构造代码从产品类中抽取出来, 并将其放在一个名为生成器的独立对象中。
具体构造者:当你需要创建不同形式的产品时, 其中的一些构造步骤可能需要不同的实现。 例如,第一个构造者使用木头和玻璃制造房屋, 第二个构造者使用石头和钢铁, 而第三个构造者使用黄金和钻石。 在调用同一组步骤后, 第一个建造者会给你一栋普通房屋, 第二个会给你一座小城堡, 而第三个则会给你一座宫殿。
指挥者(主管):将用于创建产品的一系列构造者步骤调用抽取成为单独的主管类。 主管类可定义创建步骤的执行顺序, 而构造者则提供这些步骤的实现。
严格来说, 你的程序中并不一定需要主管类。 客户端代码可直接以特定顺序调用创建步骤。 不过, 主管类中非常适合放入各种例行构造流程, 以便在程序中反复使用。
此外, 对于客户端代码来说, 主管类完全隐藏了产品构造细节。 客户端只需要将一个构造者与主管类关联, 然后使用主管类来构造产品, 就能从构造者处获得构造结果了。
产品:房屋(普通房屋,小城堡,宫殿)
代码演示(汽车)
产品对象:
// 产品对象
public class Car {
// 轮胎
private String tire;
// 座椅
private String seat;
// 发动机
private String engine;
public String getTire() {
return tire;
}
public void setTire(String tire) {
this.tire