建造者模式可以将1个产品的内部表象与产品的生成进程分割开来,从而可使1个建造进程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那末用户就只需指定需要建造的类型就能够得到它们,而具体建造的进程和细节就不需要知道。
建造者模式基础类图结构

建造者模式中存在的角色
导演者角色是与客户端打交道的角色。导演者角色将客户端创建产品的要求划分为对各个零件的建造要求,再将这些要求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。
产品角色
package com.designpattern.builder;
/**
* Created by Administrator on 2016/9/21.
*/
public class Product {
private String part1;
private String part2;
public String getPart1() {
return part1;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public String getPart2() {
return part2;
}
public void setPart2(String part2) {
this.part2 = part2;
}
@Override
public String toString() {
return "Product{" +
"part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
'}';
}
}
抽象建造者角色
package com.designpattern.builder;
/**
* Created by Administrator on 2016/9/21.
*/
abstract public class Builder {
public abstract void buildPart1();
public abstract void buildPart2();
public abstract Product retrieveResult();
}
具体建造者角色
package com.designpattern.builder;
/**
* Created by Administrator on 2016/9/21.
*/
public class ConcreteBuilder extends Builder {
private Product product = new Product();
@Override
public void buildPart1() {
System.out.println("part1部份被创建");
product.setPart1("part1");
}
@Override
public void buildPart2() {
System.out.println("part2部份被创建");
product.setPart2("part2");
}
@Override
public Product retrieveResult() {
return product;
}
}
导演者角色
package com.designpattern.builder;
/**
* Created by Administrator on 2016/9/21.
*/
public class Director {
private Builder builder;
public Product construct(Builder builder){
builder.buildPart1();
builder.buildPart2();
Product product = builder.retrieveResult();
return product;
}
}
客户端调用
package com.designpattern.builder;
/**
* Created by Administrator on 2016/9/21.
*/
public class Client {
public static void main(String[] args) {
Director director = new Director();
Builder builder = new ConcreteBuilder();
Product product = director.construct(builder);
System.out.println(product);
}
}

具体建造角色分成A和B分别用来建造产品A和产品B,本来这个具体建造者角色可以设计成1个,但是如果系统中产品类增加的话,我们就要在这个具体建造者类中添加增加的产品的建造方法,不符合软件设计的“开——闭”原则,所以,我采取了1个具体建造者负责1个具体产品类。
建造者模式跟抽象工厂模式类似,都是用来创建同时属于几个产品族的对象的模式。但是抽象工厂模式中,每次工厂对象被调用时都会返回1个完全的产品对象,客户端可能会用这个对象跟其他的对象组成更大更复杂的对象。而建造者模式是1点1点建造出1个复杂的产品,建造的进程产生的建造者角色内部,客户端拿到的就是1个完全的对象。
上一篇 uva 1393 Highway