如果说工厂模式是在创建对象的话,那么Builder模式就是一个“精工细作”的过程。
Builder模式用于把产品创建的每个步骤封装起来,对客户端关闭。
首先,我们制作一个抽象的产品,假设有2个部件:
然后是实际的产品:
接着,我们创建Builder接口,它负责装配产品部件,显示产品结果:
实际的建造者:
然后,我们设置一个[b]导演[/b],它用来组织实际的建造者:
最后,客户端和导演以及建造者打交道,对于实际产品关闭:
运行结果:
****** Built By Concrete Builder 1 ******
Product1: ConcreteBuilder1->part1, ConcreteBuilder1->part2
****** Built By Concrete Builder 2 ******
Product2: ConcreteBuilder2->part1, ConcreteBuilder2->part2
Builder模式用于把产品创建的每个步骤封装起来,对客户端关闭。
首先,我们制作一个抽象的产品,假设有2个部件:
package dp.builder.general;
public interface Product {
void setPart1(String part1);
void setPart2(String part2);
}
然后是实际的产品:
public class Product1 implements Product {
private String part1;
private String part2;
public Product1() {
part1 = "";
part2 = "";
}
public void setPart1(String part1) {
this.part1 = part1;
}
public void setPart2(String part2) {
this.part2 = part2;
}
public String toString() {
return "Product1: " + part1 + ", " + part2;
}
}
package dp.builder.general;
public class Product2 implements Product {
private String part1;
private String part2;
public Product2() {
part1 = "";
part2 = "";
}
public void setPart1(String part1) {
this.part1 = part1;
}
public void setPart2(String part2) {
this.part2 = part2;
}
public String toString() {
return "Product2: " + part1 + ", " + part2;
}
}
接着,我们创建Builder接口,它负责装配产品部件,显示产品结果:
package dp.builder.general;
abstract public class Builder {
public abstract void buildPart1();
public abstract void buildPart2();
public abstract String retrieveResult();
}
实际的建造者:
package dp.builder.general;
public class ConcreteBuilder1 extends Builder {
private Product1 product = new Product1();
public void buildPart1() {
product.setPart1("ConcreteBuilder1->part1");
}
public void buildPart2() {
product.setPart2("ConcreteBuilder1->part2");
}
public String retrieveResult() {
return product.toString();
}
}
package dp.builder.general;
public class ConcreteBuilder2 extends Builder {
private Product2 product = new Product2();
public void buildPart1() {
product.setPart1("ConcreteBuilder2->part1");
}
public void buildPart2() {
product.setPart2("ConcreteBuilder2->part2");
}
public String retrieveResult() {
return product.toString();
}
}
然后,我们设置一个[b]导演[/b],它用来组织实际的建造者:
package dp.builder.general;
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.buildPart1();
builder.buildPart2();
System.out.println(builder.retrieveResult());
}
}
最后,客户端和导演以及建造者打交道,对于实际产品关闭:
package dp.builder.general;
public class Client {
public static void main(String[] args) {
Director director = null;
System.out.println("****** Built By Concrete Builder 1 ******");
Builder builder1 = new ConcreteBuilder1();
director = new Director(builder1);
director.construct();
System.out.println("****** Built By Concrete Builder 2 ******");
Builder builder2 = new ConcreteBuilder2();
director = new Director(builder2);
director.construct();
}
}
运行结果:
****** Built By Concrete Builder 1 ******
Product1: ConcreteBuilder1->part1, ConcreteBuilder1->part2
****** Built By Concrete Builder 2 ******
Product2: ConcreteBuilder2->part1, ConcreteBuilder2->part2