设计模式之02:建造者模式(Builder模式)

将一个复杂对象的构建与它的表示解耦,使得用户在不需要知道其内部构建细节的情况下,依然可以精细的构建出不同表示的复杂对象。

优点:1. 良好的封装性;
   2. 建造者的独立性,使得易于扩展;
缺点:会产生多余的Builder对象,消耗内存。

使用场景

  1. 初始化一个对象特别复杂(如参数很多,且很多参数都有默认值),且构建之后变化性不大的。
  2. 相同方法,不同执行顺序,产生不同结果。

如:网络请求、ImageLoader的config配置

Builder模式也是一种比较常用的模式,比如经常用到的AlertDialog:

AlertDialog dialog = new AlertDialog.Builder(this)
        .setTitle("title")
        .setMessage("message")
        .create();

当然,AlertDialog也爆漏了一些属性设置的方法,但是不能链式调用:
dialog.setTitle("title_1"); dialog.setMessage("message_1");

常用实现

public class Config {

    private Builder builder;

    private Config(Builder builder) {
        //属性赋值
        this.builder = builder;
    }

    public long getConnectTimeout() {
        return builder.connectTimeout;
    }

    /**
     * 静态内部类 Builder
     */
    public static class Builder {

        private long connectTimeout = 30 * 1000;
        private long responseTimeout = 30 * 1000;
        private long timeout = 60 * 1000;
        private boolean isUseCache = true;
        private boolean isUseDiskCache = false;

        public Config build() {
            return new Config(this);
        }

        public Builder setConnectTimeout(long connectTimeout) {
            this.connectTimeout = connectTimeout;
            return this;
        }

        public Builder setResponseTimeout(long responseTimeout) {
            this.responseTimeout = responseTimeout;
            return this;
        }

        public Builder setTimeout(long timeout) {
            this.timeout = timeout;
            return this;
        }

        public Builder setUseCache(boolean useCache) {
            isUseCache = useCache;
            return this;
        }

        public Builder setUseDiskCache(boolean useDiskCache) {
            isUseDiskCache = useDiskCache;
            return this;
        }

    }

}

使用:
Config config = new Config.Builder() .setConnectTimeout(10 * 1000) .setUseDiskCache(true) .build();

你可能感兴趣的:(设计模式之02:建造者模式(Builder模式))