生成器模式

生成器模式

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

这么看起来我反正是理解不了,直接上例子

public class Phone {
    private String name;
    private String ram;
    private String rom;
    private String cpu;

    Phone(){
        this(new Builder());
    }
    Phone(Builder builder){
        this.name  = builder.name;
        this.ram = builder.ram;
        this.rom = builder.ram;
        this.cpu = builder.cpu;
    }

    public String getName() {
        return name;
    }

    public String getRam() {
        return ram;
    }

    public String getRom() {
        return rom;
    }

    public String getCpu() {
        return cpu;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "name='" + name + '\'' +
                ", ram='" + ram + '\'' +
                ", rom='" + rom + '\'' +
                ", cpu='" + cpu + '\'' +
                '}';
    }

    public static class Builder{
        private String name;
        private String ram;
        private String rom;
        private String cpu;

        Builder(){
        }
        Builder(Phone phone){
            this.name = phone.name;
            this.ram = phone.ram;
            this.rom = phone.rom;
            this.cpu = phone.cpu;
        }
        public Builder setName(String name){
            this.name = name;
            return this;
        }
        public Builder setRam(String ram){
            this.ram = ram;
            return this;
        }
        public Builder setRom(String rom){
            this.rom = rom;
            return this;
        }
        public Builder setCpu(String cpu){
            this.cpu = cpu;
            return this;
        }
        public Phone build(){
            return new Phone(this);
        }
    }
}

调用

Phone phone = new Phone.Builder()
        .setName("mi10")
        .setRam("6g")
        .setRom("256g")
        .setCpu("855")
        .build();
System.out.println(phone);
// Phone{name='mi10', ram='6g', rom='6g', cpu='855'}

根据代码来看,定义是说把一个复杂对象的构建表示分离,上面代码里的Phone类就是所说的复杂对象,该对象是由内部类Builder执行bulid()来构建的,Phone没有任何set方法,只有get方法,这就是构建与表示分离,接下来是同样的构建过程可以创建不同的表示,这段话我觉得没有特殊的含义,就像同一个函数传入的参数不同得出的结果自然可能不同。

下面我们来看看用别的方式完成这个功能

    Phone phone = new Phone()
    phone.setName("mi10")
    phone.setRam("6g")
    phone.setRom("256g")
    phone.setCpu("855")
    System.out.println(phone);
    // Phone{name='mi10', ram='6g', rom='6g', cpu='855'}

这里的Phone就是一个简单得pojo对象,我们经常也会做这种操作,但是如果属性比较多的话,这样操作看起来就不是十分的优雅,比不上链式调用看起来简洁。而且考虑在多个进程同时使用这个对象的情况下,如果别的线程正在set属性值,然后另一个线程读取了,这就会导致信息不全,如果使用生成器模式,对属性的操作都在builder对象里,只有在build之后才会给Phone对象赋值,所以不会发生这种情况。

Phone phone = new Phone("mi10","6g","256g","855")
System.out.println(phone);
// Phone{name='mi10', ram='6g', rom='6g', cpu='855'}

当然我们也可以用构造函数实现,但是如果属性一多,为了满足多种参数需求,那就需要多重构造函数,想想就有点害怕,而且参数位置还是固定的不是很自由。

总结

以上就是我对生成器模式的理解,复杂对象负责表示,内部类builder负责创建对象。

posted @ 2020-04-08 20:07  林静生寒  阅读(196)  评论(0编辑  收藏  举报