建造者模式
周末研究了建造者模式准备写点东西出来,却有种话到嘴边,说不出来的感觉。然后今天上班看到写在黑板上的笔记突然有种醍醐灌顶的感觉,为什么呢?就是感觉 想通了关于设计模式几个最关键的问题?这种设计模式是为了解决什么问题?这个设计模式是怎么解决这个问题的?这个设计模式的特点是什么?也就是区别于其他设计模式的地方在哪里?这些问题都是研究设计模式的核心。
建造者模式解决了什么问题?
解决创建复杂且又多变的对象的问题。当需要创建的对象比较复杂且多变时,创建工作就变得比较艰难。这时候便需要建造者模式。
我就以造房子为例,一步一步地将建造者模式融入到我们的代码当中。我们找到了一个专门造套房的团队,他们会打地基,会砌墙,会铺电线,会打孔,会铺砖...各种各样的技能。那么最原始的方法,就是我们拿到这个团队,然后按造房子的步骤走,例子如下(这是反面典型):
public class Customer {
public static void main(String[] args) {
Builder builder = new Builder(); //此处的builder就是我们的建设团队
//打地基
builder.diji();
//铺砖
builder.puzhuan();
//铺电线
builder.pudianxian();
//上油漆
builder.youqi();
//拿到房子
Product product = builder.getProduct();
}
}
如果我们下次不造套房了,改成造别墅。那么就换一个造别墅的团队,再重复上面的步骤。那么问题来了,因为步骤很复杂,万一哪天弄糊涂了,在叫他们铺电线钱,就让他们把油漆上了...这种麻烦的事情每次都要自己去一步一步走下去,迟早是会出问题的。所以我们需要有一个专业的,绝对不会出错的人士来代替我们去指挥,这个就是建造者模式。
建造者模式如何解决这个创建对象的问题?
解决这种问题,首先还是要对应生活,在生活中找到工作的真谛,因为工作也仅仅是生活的一部分。
假如我们现在在上海的世纪公园旁买了一套房子,为了住的更加舒适,肯定需要装修。这个房子价值千万,因此装修也必定是一个大工程。
作为房主,我们现在应该怎么办?
那我们一定会找一家专业装修且靠谱的大公司,为什么选择大公司?因为大公司比较规范,管理也比较严格(这也是建造者模式的优点)。到大公司找到一个经验丰富的团队leader.这个就是团队的指挥者。
Leader必须包括两个要素1.一只素质过硬的团队 2.规范的作业流程
装修流程
选择好leader,下一步就是我们来挑选装修方案、装修风格,公司根据方案、风格挑选合适的施工队来进行施工。然后就开工了。
第一步、找到一个指挥者 (找到一个大公司骨干人员Leader),该公司骨干精通装修的作业流程,知道怎么指挥:
public class Director { //大公司
private Builder builder; //装修团队
public Director(Builder builder) {
this.builder = builder;
}
public Product decorate() { //规范的作业流程
builder.diji();
//铺砖
builder.puzhuan();
//铺电线
builder.pudianxian();
//上油漆
builder.youqi();
return 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();
}
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;
}
}
第三步:带领施工队到世纪公园的家里开始装修了!!!
public class House {
public static void main(String[] args) {
Director director = new Director(new ABuilder()); //把欧洲风的装修意见给Leader
//安装装修规范进行装修。
Product EuropeanStyleHouse = director.decorate();
}
}