Builder模式

2019-02-21 13:40:27 浏览数 (1)

1.定义

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

2.使用场景

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

3.简单实现

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

代码语言:javascript复制
//抽象类
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实现类

代码语言:javascript复制
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;
    }

}

测试代码就一句话

代码语言:javascript复制
    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 人点赞