建造者模式
建造者模式,是为创建复杂且又多变的对象,而诞生的一种模式。
我们先整理一下,这样复杂的一个对象,想创建它又哪些难点:1、创建步骤繁杂,2、子类特别多。
我就以造房子为例,一步一步地将建造者模式融入到我们的代码当中。我们找到了一个专门造套房的团队,他们会打地基,会砌墙,会铺电线,会打孔,会铺砖...各种各样的技能。那么最原始的方法,就是我们拿到这个团队,然后按造房子的步骤走,例子如下(这是反面典型):
public class Customer {
public static void main(String[] args) {
Builder builder = new Builder();
//打地基
builder.diji();
//铺砖
builder.puzhuan();
//铺电线
builder.pudianxian();
//上油漆
builder.youqi();
//拿到房子
Product product = builder.getProduct();
}
}
如果我们下次不造套房了,改成造别墅。那么就换一个造别墅的团队,再重复上面的步骤。那么问题来了,因为步骤很复杂,万一哪天弄糊涂了,在叫他们铺电线钱,就让他们把油漆上了...这种麻烦的事情每次都要自己去一步一步走下去,迟早是会出问题的。所以我们需要有一个专业的,绝对不会出错的人士来代替我们去指挥,这个就是建造者模式。
第一步、
来一个指挥者,他精通建筑物的建造流程,知道怎么指挥:
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Product direct() {
//打地基
builder.diji();
//铺砖
builder.puzhuan();
//铺电线
builder.pudianxian();
//上油漆
builder.youqi();
return builder.getProduct();
}
}
第二步、
创建一个消费者,消费者顾一批施工团队,给指挥者去指挥
public class Customer {
public static void main(String[] args) {
Director director = new Director(new ABuilder());
//拿到房子
Product product = builder.getProduct();
}
}
第三步、
这个Builder类,也就是我们的施工队,可以有很多种,所以Builder是一个接口,底下有各种实现类,至于Product类请自行脑补一个:
public abstract class Builder {
protected abstract void diji();
protected abstract void puzhuan();
protected abstract void pudianxian();
protected abstract void youqi();
protected abstract Product getProduct();
}
---------------------------------------------------------------------------------------
public class ABuilder extends Builder{
private Product product;
@Override
protected void diji() {
product.diji();
}
@Override
protected void puzhuan() {
product.puzhuan();
}
@Override
protected void pudianxian() {
product.pudianxian();
}
@Override
protected void youqi() {
product.youqi();
}
protected Product getProduct() {
return product;
}
}
建造者模式和工厂模式的区别
比较两者的客户端,发现两者很像,都是从工厂类(指挥者类)拿产品,然后再使用产品,那么两者有什么区别呢?区别在于内部,建造者注重构建这个对象的过程把控,工厂模式则没有关注这一点,工厂模式中,每个产品的加工流程可以都不相同,而建造者的产品起码要有一部分流程是相似的。我个人是这么理解的。