一、简介:
在软件设计中,有时候面临一个“复杂对象”的创建工作,其通常由各个部分的子对象用一定算法构成;
由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合到一起的算法稳定。
二、 建造者的具体体现
例如:电脑城的老板是直接和客户联系的,然而电脑的组装是由老板指挥装机人员去把电脑的各个部分
组装起来,真正负责创建电脑的人就是电脑城的装机人员,了解这些逻辑之后,下面就具体看下如何用
代码实现生活中的逻辑过程:
/**
*客户类.
*/
public class Customer {
public static void main(String[] args) {
//客户找到电脑城老板说要买电脑,这里要装两台电脑
//创建指挥者和构建者
Director director = new Director();
Builder builder1=new ConcreateBuilder1();
Builder builder2=new ConcreateBuilder2();
//老板叫员工去组装一台电脑
director.buildeComputer(builder1);
//组装完之,组装人员搬来组装好的电脑
Computer computer1 = builder1.getComputer();
computer1.show();
//老板叫员工去组装第二台电脑
director.buildeComputer(builder2);
//组装完之后,组装人员搬来组装好的电脑
Computer computer2 = builder2.getComputer();
computer2.show();
}
}
/**
* 小王和小李都是电脑组装工,谁都不会自愿的去组装,这必须有一个
* 人叫他们去组装才会去,当然这就是老板了,也就是建造者模式中的
* 指挥者,指挥创建过程类
*/
public class Director {
//组装电脑
public void buildeComputer(Builder builder) {
builder.buildPartCpu();
builder.buildPartCpu();
}
}
/**
* 抽象建造者,这个场景下为"组装人",这里也可以定义为接口
*/
public abstract class Builder {
//组装cpu
protected abstract void buildPartCpu();
//组装主板
protected abstract void buildPartMainBoard();
//组装还有硬盘,电源。。。
//组装好了电脑
protected abstract Computer getComputer();
}
/**
* 电脑类.
*/
public class Computer {
//电脑组件集合
private List<String> parts=new ArrayList<String>();
//把单个组件添加到电脑组件集合中去
public void add(String part){
parts.add(part);
}
public void show(){
System.out.println("电脑组装开始");
for (String str : parts){
System.out.println(str);
}
System.out.println("电脑组装好了。");
}
}
/**
*具体创建者,具体的某个人为具体创建者,例如:装机小李
*/
public class ConcreateBuilder1 extends Builder {
Computer computer = new Computer();
@Override
protected void buildPartCpu() {
computer.add("cpu1");
}
@Override
protected void buildPartMainBoard() {
computer.add("mainBoard1");
}
@Override
protected Computer getComputer() {
return computer;
}
}
/**
*具体创建者,具体的某个人为具体创建者,例如:装机小王
*/
public class ConcreateBuilder2 extends Builder {
Computer computer = new Computer();
@Override
protected void buildPartCpu() {
computer.add("cpu2");
}
@Override
protected void buildPartMainBoard() {
computer.add("mainBoard2");
}
@Override
protected Computer getComputer() {
return computer;
}
}
运行结果:
电脑组装开始
cpu1
cpu1
电脑组装好了。
电脑组装开始
cpu2
cpu2
电脑组装好了。
三、建造者模式的定义和类图
四、建造者在java代码中的具体体现
StringBuilder类扮演着建造string对象的具体建造者角色,其中ToString()方法用来返回具体产品
给客户端(相当于上面代码中getComputer方法)。其中Append方法用来创建产品的组件(相当于
上面代码中BuildPartA和BuildPartB方法),因为string对象中每个组件都是字符,所以也就不需
要指挥者的角色的代码(指的是buildeComputer方法,用来调用创建每个组件的方法来完成整个产品的组装),
因为string字符串对象中每个组件都是一样的,都是字符,所以Append方法也充当了指挥者buildeComputer方法的作用。
五、总结
优点:
Builder模式解决的是: “分步骤构建一个复杂的对象,组合在一起的算法相对稳定”,而复杂对象的各个部分经常变化。
抽象工厂模式:解决系列对象的需求变化。
缺点:
Builder模式难以应对”分步构建算法的需求变动“。;