建造者模式:将一个复杂对象的创建和表示分离(有点类似与MVC模型),可以使得同样的创建过程可以创建不同的对象。
建造者模式将一个产品的内部表示和生产过程分离开,比如我们需要制造一个玩具,分为三大部分:制造头、身体、外形。
我们设计如下:
(1)定义玩具Toy接口
(2)定义一个具体类,实现Toy接口
(3)定义Builder类,用于生产玩具
(4)测试类
总结:
建造者模式将一个复杂对象的创建和表示分离,可以使得同样的创建过程可以创建不同的对象。
优点
(1)建造者设计模式比较独立,将对象本身与构建过程解耦;
(2)精准控制构建出的对象和内容,构造层和显示层是分离的;
(3)写法上更加优雅;缺点
(1)范围受限,不适合差异较大的对象;
(2)内部复杂多变,构造类相对会多;
思考1:建造者设计模式应用场景?
Java源码中的StringBuilder和StringBuffer中的append方法就是利用了建造者设计模式(稍微有点差别),它们继承自抽象类AbstractStringBuilder。AbstractStringBuilder类似于本例中的Toy接口(因为接口方法全是抽象的,类似于抽象类)。StringBuilder和StringBuffer相当于本例中的Toy接口的具体实现类(MyToyImpl类)。
思考2:建造者设计模式与抽象工厂模式有啥区别?
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式的主要目的是通过组装零配件而产生一个新产品,两者的区别还是比较明显的。
例如:现代化的汽车工厂能够批量生产汽车,不同的工厂生产不同的汽车,宝马工厂生产宝马牌子的车,奔驰工厂生产奔驰牌子的车。这就是抽象工厂设计模式;
而建造者模式,在于如何组装车辆,可能发动机用宝马的,车身用奔驰的。
也可以用宝马的发动机,宝马的车身组装。