五种成立型方式之一

1.前言


单例方式可以成立出一个实例,并且那么些实例存在的情景下,不会再创设出一致的实例。然而,有个通晓的短处,就是增加性不高。实际开销中平日会境遇别的一种创设对象的景观,按照用户必要对实例进行设置。若放在构造函数中,要么加判断语句,要么重载构造函数,很不利索;若通过setter注入,会大增很多与效益不相干的法门,而且对象的设置一般位于起先化时,不可能让用户随时修改。

2.概念


建造者形式将一个繁杂对象的构建与它的代表分离,使得对象专注于功效的来得,隐藏其中的落到实处。须要专注的是,一旦创建了对象,就不可修改配置了。还有最简单被误解的第二句,无异于的构建进程可以创制分化的意味,即成立对象的算法应该单独于它的装配形式,允许制造结果有两样代表。

3.场景


食物厂准备生育月饼,须求基于市场喜好制作一套模具。然后,通过模具给月饼胚子成形,表面印上花纹。那里必要小心的是,大家可以新建分歧的模具,让食物厂生产分化的月饼。

4.写法

public final class Mooncakes {

    // 1.创建的对象所具有的属性
    private int mSize;
    private String mName;

    private Mooncakes(int size, String name) {
        super();
        mSize = size;
        mName = name;
    }

    // 2.创建的对象所表现的功能
    public void product() {
        System.out.println("开始生产  " + mSize + "号大小  " + " " + mName + "花纹的月饼");
    }

    public static class Builder {

        // 3.构造器存储对象的属性
        private int mSize = 10;
        private String mName = "";

        // 4.向构造器设置对象的属性
        public Builder setSize(int size) {
            if (size > 0) {
                mSize = size;
            }
            return this;
        }

        public Builder setName(String name) {
            if (name != null && !name.equals("")) {
                mName = name;
            }
            return this;
        }

        // 5.通过构造器构造对象
        public Mooncakes build() {
            return new Mooncakes(mSize, mName);
        }

    }

}

public class Company {

    public static void main(String[] args) {
        // 先制作模具,在生产月饼
        new Mooncakes.Builder().setSize(4).setName("嫦娥").build().product();
        new Mooncakes.Builder().setName("嫦娥").build().product();
        new Mooncakes.Builder().setSize(4).build().product();
    }

}

伟德国际1946手机版客户端,不明白,大家可有发现一个题目。纵然一个切实可行的模具与一种月饼绑定,不过模具的炮制没有正规,相比随便,不符合实际。所以,我们得关注第二点概念。那里有局地误区,我们能够参见happyhippy的文章,看最终的宗旨情想就够了,毕竟大家谈论的前提是算法不变。Director
定义了模具的造作专业,具体怎么实施由Builder完毕类决定。

// 1.构造复杂对象默认实例
public class Mooncakes {

    private int mSize;
    private String mName;

    public Mooncakes() {
        super();
        mSize = 10;
        mName = "";
    }

    public void setmSize(int mSize) {
        this.mSize = mSize;
    }
    public void setmName(String mName) {
        this.mName = mName;
    }

    @Override
    public String toString() {
        return "Mooncakes [mSize=" + mSize + ", mName=" + mName + "]";
    }

}

// 2.导向器,定义复杂对象的构建算法
public class Director {

    private Builder mBuilder;

    public Director(Builder builder) {
        super();
        mBuilder = builder;
    }

    // 对于月饼而言,步骤是不会变的,先定型后印花
    public Mooncakes produceMooncakes() {
        return mBuilder.setSize(4).setName("嫦娥").build();
    }

}

// 3.抽象出对象的组装方式
public abstract class Builder {

    protected Mooncakes mCakes = new Mooncakes();

    public abstract Builder setSize(int size);

    public abstract Builder setName(String name);

    public Mooncakes build() {
        return mCakes;
    }

}

// 4.按照正常的方式设置
public class NormalBuilder extends Builder {

    @Override
    public Builder setSize(int size) {
        if (size > 0) {
            mCakes.setmSize(size);
        }
        return this;
    }

    @Override
    public Builder setName(String name) {
        if (name != null && !name.equals("")) {
            mCakes.setmName(name);
        }
        return this;
    }

}

// 5.按照我的方式设置
public class LanceBuilder extends Builder {

    @Override
    public Builder setSize(int size) {
        if (size > 0) {
            mCakes.setmSize(size * 2);
        }
        return this;
    }

    @Override
    public Builder setName(String name) {
        if (name != null && !name.equals("")) {
            mCakes.setmName("欢乐" + name);
        }
        return this;
    }

}

public class Company{

    public static void main(String[] args) {
        // 先制作模具,在生产月饼
        Mooncakes normalCakes = new Director(new NormalBuilder()).produceMooncakes();
        Mooncakes lanceCakes = new Director(new LanceBuilder()).produceMooncakes();
        System.out.println(normalCakes.toString());
        System.out.println(lanceCakes.toString());
    }

}

5.总结


建造者情势在安卓支付中比较广泛,首要是调用系统的控件,比如说Dialog、Notification等急需做大批量自定义设置的。由于通过链式调用,使得代码简洁易懂,将打包与壮大很好地构成起来。当然,缺点也很肯定,多了过多类。

相关文章