关于Builder设计模式的一些感想

以下全文为Builder设计模式的读后感

Builder模式主要有以下几个角色构成:

1. 领导 : 他的作用是和客户交流(交付产品等)以及吩咐工人干活;

2. 建筑工人:干活的人;

3. 建筑工人手册:建筑工人需要遵循的规章制度;

4. 产品 : 房子(最终产品);

5. 客户 :和领导交流(对房子有什么要求....等);


首先是工人手册,因为先有手册,工人才知道怎么做:

/**
 * 工人手册(那些干活的必须得遵循我的规章制度)
 */
abstract class WorkerManual {
	private House house ;
	/**
	 * 构建城墙
	 */
	public abstract void buildWall();
	/**
	 * 做窗户
	 */
	public abstract void buildWindow();
	/**
	 * 向领导交付产品
	 */
	public House handInHouse(){
		return house;
	}
}

既然工人手册已经有了,那么工人就可以按照手册去干活了(必须先把窗户和墙体单独做好)

/**
 * 我是干活的
 */
public class Worker extends WorkerManual{
	@Override
	public void buildWall() {
		System.out.println("我们正在努力的建造墙体");
	}
	@Override
	public void buildWindow() {
		System.out.println("我们正在努力的建造窗户");
	}
}

领导:等会儿,你们这不是瞎干嘛,没有墙,你们这个窗户怎么放上去(要有顺序),来,我来安排一下

/**
 * 领导(我不干活,我主要吩咐下面的人干活)
 */
public class Leader {
	private WorkerManual worker;
	public void doSomething(){
		worker = new Worker();
		worker.buildWall(); //先把墙做好了,再做窗户
		worker.buildWindow(); 
		House handInHouse = worker.handInHouse(); //把房子给我交付上来(地址在哪儿..),我看看
		//...客户让我干啥来着?好像是检查一下房子有没有什么问题....
	}
}

客户->领导:对房子我提点意见。。。

/**
 * 客户(我是来检验房子的)
 */
public class Client {
	public static void main(String[] args) {
		Leader leader = new Leader();
		leader.doSomething();//告诉领导对房子有什么要求...等
	}
}

房子

/**
 * 工人最终要向领导交付的产品--房子
 */
public class House {}

我们发现这个案例设计中,存在以下需要注意的几个点(划线部分为对应Builder模式中的特点):

1. 工人必须依照手册干活,手册里面提到要做窗户,你就得做;要做墙,那么你们就得砌墙;还有别的需求...行,反正工人都会去做;抽象建构者提供规范,这是他存在的理由

2. 由工人提供产品(东西是我们做的,当然得有我们提供);具体建造者提供最终的产品

3. 领导不干活,领导的职责就是吩咐工人干什么活,工人怎么干的,他不清楚,并且这里面的活,包括砌墙和装窗户,都是分开的,工人有时候摸不清头脑,不知道应该先做哪个,这个时候,领导就会吩咐他们先干什么,再干什么;构造零件(构件)是有顺序而言的,并且上层并不用关心里面是如何实现的,并且这个产品最终交付给这一层

4. 客户和领导交流,他和工人们也没啥可聊的,工人们系统谈论技术,而客户关心的是房子;客户端主要与领导层沟通,构建的具体实现对他隐藏;

Builder模式可以再精简吗?

1. 如果只有一个建筑工人的话,那就不用什么手册了,有什么直接告诉工人就行;抽象建造者角色存在的目的就是规范具体建造者角色的行为,而系统如果只有一个具体的建设者,那这个规范就不需要了

2. 如果没有领导的话,好吧,这个时候,就由工人直接和客户沟通了(他们主要沟通房子,不聊细节,免得尴尬),但是工人还是需要提供方法,这个方法按照顺序执行了各个零件的构造;也就是说以下方法,工人是肯定需要的;

public void doSomething(){
    worker = new Worker();
    worker.buildWall(); //先把墙做好了,再做窗户
    worker.buildWindow(); 
    House handInHouse = worker.handInHouse(); //把房子给我交付上来(地址在哪儿..),我看看
    //...客户让我干啥来着?好像是检查一下房子有没有什么问题....
}

3 .还能再精简吗?...回答这个问题之前,我们先来看看Builder模式的特点,你再精简,如果将Builder模式的特点都精简没了,那这就不是Builder模式了;

Builder模式的特点:

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

如何解决:将变与不变分离开。


我们发现,Builder模式中最最重要的部分应该是这个“组合”了,组合是一种算法,它是固定不变的,但是里面的细节也许会改变(就比如窗户是会变的,墙也会,但是先做墙再做窗户的规则是死的),Builder模式就是将这个不变的部分抽离了出来,以后修改时,只可能改具体的实现(建筑工人);




猜你喜欢

转载自blog.csdn.net/jianlong1284537512/article/details/79482742