Java建造者模式以及常见误区错误分析纠正

设计模式复习,代码是最好的说明。


注意:

在写建造者模式的时候,我发现大部分文章都犯了不少错误,猜测应该是由于缺乏独立思考而又都参考了同一篇含错误的源文章导致的。现总结如下:


问题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

如有错误,欢迎纠正!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值