1 介绍
使用多个简单的对象一步一步构建成一个复杂的对象。实现对象设计和创建解耦。
2 例子
假设要不同厂商生产不同牌子的自行车。
2.1 自行车类
//自行车类
class Bicycle {
private String type;//自行车的类型:电动的、非电动的
private String color;//颜色
private boolean light;//是否带电灯
//设置这些属性
public void setColor(String color) {
this.color = color;
}
public void setLight(boolean light) {
this.light = light;
}
public void setType(String type) {
this.type = type;
}
//变成字符串
public String toString(){
return "type:"+this.type+" color:"+this.color+" light:"+this.light;
}
}
2.2 抽象建造者
//抽象建造者
interface Builder{
void setColor();
void setLight();
void setType();
Bicycle getBicycle();
}
2.3 具体生产商
//泰山牌
class TaishanBicycle implements Builder{
//创建一个实例
Bicycle bicycle=new Bicycle();
@Override
public void setColor() {
bicycle.setColor("白色");
}
@Override
public void setLight() {
bicycle.setLight(true);
}
@Override
public void setType() {
bicycle.setType("电动车");
}
@Override
public Bicycle getBicycle() {
return this.bicycle;
}
}
//小鹿牌自行车
class Xiaolu implements Builder{
//创建一个实例
Bicycle bicycle=new Bicycle();
@Override
public void setColor() {
this.bicycle.setColor("黑色");
}
@Override
public void setLight() {
this.bicycle.setLight(false);
}
@Override
public void setType() {
this.bicycle.setType("非电动");
}
@Override
public Bicycle getBicycle() {
return this.bicycle;
}
}
2.4 指挥生产者
//指挥者
class Director {
public void build(Builder builder) {
builder.setColor();
builder.setLight();
builder.setType();
}
}
2.5 测试主类
public class Main {
public static void main(String[] args) {
Director director=new Director();
TaishanBicycle taishanBicycle=new TaishanBicycle();
director.build(taishanBicycle);
Bicycle bicycle=taishanBicycle.getBicycle();
//使用
System.out.println(bicycle.toString());
}
}
3 例子升华
其实上面那个例子不太好,但是经过这个例子,也有一些新的感悟。
最恰当的例子,甲方乙方合作生产一个产品更加适合。
4 总结
4.1 核心角色
- 产品类:这是一个实体类,包含了属性和方法(getter和setter),最重要的是setter。可以把这个想象成甲方想要做一个产品,他不知道怎么才是最精简的方式,于是把所有的属性和方法都全部加入进去图纸准备好。
- 抽象建造者:这里面包含两个东西,就是构建这个产品的方法,不必知道怎么做的,只有个甲方模糊认识即可,比如把大象装进冰箱要几步?以及一个产品对象。
- 具体建造者:实现抽象建造者,乙方们实现了甲方的方法,去生产这个产品,各个乙方的想法都不一样,操作也不一样,所以生产出来的产品也不太一样。
- 指挥者:执行所有抽象方法。甲方拿到了乙方的解决方案,按照我的计划(抽象建造者)全部执行一遍。
4.2 核心代码结构
产品类是实体类完善的且不变的。不同的建筑者去执行不同的建造方案。
缺点:产品类要定义好,否则只要一变化,建造者们都要变!!!
5 与工厂模式的不同
工厂模式的重点在于生产模式,怎么去产生对象比较好,而不太关心这个对象本身情况。
建造者模式重点在于产品本身,需要创建什么样的对象。
例如:工厂模式在乎的是人员去哪儿,而建造者模式在乎人长什么样子。二者可以一起用,并不矛盾。