设计模式复习,代码是最好的说明。
注意:
在写建造者模式的时候,我发现大部分文章都犯了不少错误,猜测应该是由于缺乏独立思考而又都参考了同一篇含错误的源文章导致的。现总结如下:
问题1:混淆director和builder的关系,如http://blog.csdn.net/zhengzhb/article/details/7375966
解决:builder的接口应该是定义如何构建产品的各个部件,而director的接口是定义产品整体的构建算法
问题2:很多代码中builder和product的关系都是聚合关系,而非依赖关系
解决:builder聚合产品的部件而非整体,这样才能实现依赖关系,而这个依赖关系是整个建造者模式的重点之一
定义:建造者模式将一个复杂的对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示
UML:
代码:
public class BuilderMode {
public static void main(String[] args) {
IBuilder builder = new BuilderL();
Director director = new Director(builder);
director.construct();
System.out.println(builder.getProduct().toString());
builder = new BuilderU();
director = new Director(builder);
director.construct();
System.out.println(builder.getProduct().toString());
}
}
class Product{
private String partA;
private String partB;
private String partC;
public Product(String partA, String partB, String partC) {
this.partA = partA;
this.partB = partB;
this.partC = partC;
}
@Override
public String toString() {
return "Product{" +
"partA='" + partA + '\'' +
", partB='" + partB + '\'' +
", partC='" + partC + '\'' +
'}';
}
}
interface IBuilder{
void buildPartA();
void buildPartB();
void buildPartC();
Product getProduct();
}
class BuilderU implements IBuilder{
private String partA;
private String partB;
private String partC;
public void buildPartA() {
this.partA=new String("A");
}
public void buildPartB() {
this.partB=new String("B");
}
public void buildPartC() {
this.partC=new String("C");
}
public Product getProduct() {
return new Product(partA,partB,partC);
}
}
class BuilderL implements IBuilder{
private String partA;
private String partB;
private String partC;
public void buildPartA() {
this.partA=new String("a");
}
public void buildPartB() {
this.partB=new String("b");
}
public void buildPartC() {
this.partC=new String("c");
}
public Product getProduct() {
return new Product(partA,partB,partC);
}
}
class Director{
private IBuilder builder;
public Director(IBuilder builder) {
this.builder = builder;
}
public void construct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
参考:
http://www.cnblogs.com/devinzhang/archive/2012/01/06/2314670.html
http://www.jianshu.com/p/f3cf42416dff
如有错误,欢迎纠正!