建造者模式

周末研究了建造者模式准备写点东西出来,却有种话到嘴边,说不出来的感觉。然后今天上班看到写在黑板上的笔记突然有种醍醐灌顶的感觉,为什么呢?就是感觉 想通了关于设计模式几个最关键的问题?这种设计模式是为了解决什么问题?这个设计模式是怎么解决这个问题的?这个设计模式的特点是什么?也就是区别于其他设计模式的地方在哪里?这些问题都是研究设计模式核心

建造者模式解决了什么问题?

解决创建复杂且又多变的对象的问题。当需要创建的对象比较复杂且多变时,创建工作就变得比较艰难。这时候便需要建造者模式。

我就以造房子为例,一步一步地将建造者模式融入到我们的代码当中。我们找到了一个专门造套房的团队,他们会打地基,会砌墙,会铺电线,会打孔,会铺砖...各种各样的技能。那么最原始的方法,就是我们拿到这个团队,然后按造房子的步骤走,例子如下(这是反面典型):

  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();
	}
}
posted @ 2018-09-17 18:55  奔跑的大龙猫  阅读(168)  评论(0编辑  收藏  举报