创建型 建造者模式

5 阅读2分钟

建造者模式的使用场景:

  1. 当被创建的对象内部成员之间相互依赖时,不能单纯的直接new出来;

  2. 当初始化参数比较多时,直接new出来,构造方法内的参数过多,代码不够简洁,容易出错;

  3. 直接new出来对象,再采用set方法为成员赋值时,可能会产生在所有需要set的属性被设置前,该对象处于无效状态,而有时候我们的需求是对象创建出来即生效;

 4. 如果需要一次性创建相互有依赖关系的多个对象时,就应该使用建造者模式。

 

工厂模式跟建造者模式的区别:

工厂方法是创建同一种类针对的很多,而 Builder 模式创建的是一个对象,只针对一个。他们两个侧重面不同。

工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。

网上有一个经典的例子很好地解释了两者的区别。顾客走进一家餐馆点餐,我们利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉。对于披萨来说,用户又有各种配料可以定制,比如奶酪、西红柿、起司,我们通过建造者模式根据用户选择的不同配料来制作披萨。

 

/**

 * 建造者模式

 */

public class ThreadPoolConfig {

    private String name;

    private int coreThreadNum;

    private int maxThreadNum;

    private long keepAlive;

 

    private ThreadPoolConfig(Builder builder){

        this.name = builder.name;

        this.coreThreadNum = builder.coreThreadNum;

        this.maxThreadNum = builder.maxThreadNum;

        this.keepAlive = builder.keepAlive;

    }

 

    public static class Builder{

        private String name;

        private int coreThreadNum;

        private int maxThreadNum;

        private long keepAlive;

 

        public Builder setName(String name){

            this.name = name;

            return this;

        }

 

        public Builder setCoreThreadNum(int coreNum){

            this.coreThreadNum = coreNum;

            return this;

        }

 

        public Builder setMaxThreadNum(int maxNum){

            this.maxThreadNum = maxNum;

            return this;

        }

 

        public Builder setAlive(Long keepAlive){

            this.keepAlive = keepAlive;

            return this;

        }

 

        public ThreadPoolConfig build(){

            if(TextUtils.isEmpty(name)){

                throw new IllegalArgumentException("name not empty");

            }

            if(coreThreadNum < 0){

                throw new IllegalArgumentException("num not below 0");

            }

            return new ThreadPoolConfig(this);

        }

    }

 

 

}