Builder模式

来源:互联网 发布:马鞍山知谷教育图片 编辑:程序博客网 时间:2024/06/05 16:33

1.定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.使用场景

(1)相同的方法,不同的执行顺序,产生不同的事件结果时。
(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个使用建造者模式非常适合。
(4)当初始化一个对象特别复杂时,如参数多,且很多参数有默认值。

3.简单实现

定义一个要建造对象的抽象类和实现类

//抽象类public abstract class Computer {    protected String mOS;    protected String mBoard;    protected String mDisplay;    public void setBoard(String mBoard) {        this.mBoard = mBoard;    }    public void setDisplay(String mDisplay) {        this.mDisplay = mDisplay;    }    public abstract void setOS();    @Override    public String toString() {        return "Computer [mOS=" + mOS + ", mBoard=" + mBoard + ", mDisplay="                + mDisplay + "]";    }}//实现类public class MacComputer extends Computer {    @Override    public void setOS() {        mOS = "Mac";    }}

再定义一个抽象的builder类和builder实现类

public abstract class Builder {    public abstract Builder setBoard(String mBoard);    public abstract Builder setDisplay(String mDisplay);    public abstract Builder setOS();    public abstract Computer create();}public class MacBookBuilder extends Builder {    private Computer mComputer = new MacComputer();    @Override    public Builder setBoard(String mBoard) {        mComputer.setBoard(mBoard);        return this;    }    @Override    public Builder setDisplay(String mDisplay) {        mComputer.setDisplay(mDisplay);        return this;    }    @Override    public Builder setOS() {        mComputer.setOS();        return this;    }    @Override    public Computer create() {        return mComputer;    }}

测试代码就一句话

    public static void main(String[] args) {        Computer computer = new MacBookBuilder().setBoard("111")                .setDisplay("222").setOS().create();        System.out.println(computer);    }

你会发现他和装饰类有点像,参考资料在这里:
http://blog.csdn.net/u010955843/article/details/24875903

4.总结

优点:
(1)良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成细节。
(2)建造者独立,容易扩展。
缺点:
(1)会产生多余的Builder对象及Director对象(这里被我简化了),消耗内存。

0 0
原创粉丝点击