什么是建造者模式
玩过橡皮泥没?玩过乐高积木没?橡皮泥、乐高积木,这两个东西就能充分体现建造者模式的含义。
相同的材料,不同的组装思路,能够得到花样的产品模型,这就是建造者模式最核心的思想。
建造者模式跟工厂模式很像,因为都是生产对象的模式,所以容易混淆在一起。它们的区别在于:
- 工厂模式侧重于用不同材料生产不同产品,关注材料多样性,不关注组装灵活性
- 建造者模式侧重于用相同材料组装成不同产品,关注组装灵活性,不关注材料多样性
模式设计与实现
通常情况下,使用建造者模式,会有三类角色概念:
- 产品类:这是最根本的角色,必须要有的,并且,产品在设计上应该具有可拆分、可组装的特性
- 建造者:可以根据规范说明,把零部件组装成产品的角色,就像是玩积木的小孩子
- 指挥者:掌握着产品设计需求,可以指挥建造者行动的角色,就像是引导孩子用乐高积木搭建出各种模型的家长
理清角色关系,掌握模式的核心要点以后,代码实现也有多种多样的选择。
因为产品是可拆分的,所以,很容易想到,在代码层面,类与类之间使用组合关系会更好。
代码实现大概是这个样子的吧:
// 产品类:为了少写点代码,属性定义为public
public class Product {
public String partA;
public String partB;
public String partC;
}
// 建造者
public class Builder {
// 根据需求规范建造产品
public Product buildProduct(String partA, String partB, String partC) {
Product product = new Product();
product.partA = partA;
product.partB = partB;
product.partC = partC;
return product;
}
}
// 指挥者
public class Director {
private Builder builder;
public Director(Builder builder) { this.builder = builder; }
// 产品模型1
public Product getProduct1() {
String partA = "1个红色的乐高积木";
String partB = "2个黄色的乐高积木";
String partC = "3个蓝色的乐高积木";
return builder.buildProduct(partA, partB, partC);
}
// 产品模型2
public Product getProduct2() {
String partA = "10个白色的乐高积木";
String partB = "20个黑色的乐高积木";
String partC = "30个蓝色的乐高积木";
return builder.buildProduct(partA, partB, partC);
}
}
这段代码只是展示出建造者模式的基本概念和实现思路,实际使用当中,通常还会融入其它的设计模式,例如工厂方法、抽象模版方法等。
Builder
类的设计看着和简单工厂模式很像吧?其实它俩只是代码写的像,逻辑含义是有区别的,主要体现在方法参数上:
- 简单工厂的参数含义是“哪一种类型的产品”
- 建造者方法的参数含义是“产品的成分是什么”
如果拿乐高举例,到目前为止,我们的指挥者Director
可以搭建两种乐高模型。
如果要搭建更多不同样式的乐高模型,只需要在指挥者Director
里面继续添加搭建方法,给出具体的模型搭建方案即可,产品类和建造者都不需要改动。