Java设计模式————建造者模式(带方法链的内部建造者类)

      之前在学习建造者模式的时候,我们也了解到,在构建不同形式和状态的对象最直接的方法就是构建多个构造方法,按照不同的场景进行不同的实例化操作,但如果类比较复杂的时候,需要的构造方法也会变多,我们可以使用建造者模式来避免这种情况。建造者模式还有一种写法方式,是使用内部建造者类和方法链的形式来代替构建多个构造方法。

      方法链:是指通过特定的方法返回当前对象(this)的一种技术,通过这种技术,可以以链的形式调用方法。

例子如下:

1、定义一个Phone类,采用使用带方法链的内部建造者类的方式来实例化该Phone对象

package com.bran.builder.type1;

public class Phone {
    private String cpu;
    private String memory;
    private String disk;

    //Getter和Setter方法,为防止看着乱,我就省略写了

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", disk='" + disk + '\'' +
                '}';
    }

    //定义静态方法获取内部建造者类
    public static Phone.Builder builder(){
        return new Phone.Builder();
    }

    //私有化全参构造方法,提供给内部建造者类使用
    private Phone(String cpu, String memory, String disk) {
        this.cpu = cpu;
        this.memory = memory;
        this.disk = disk;
    }

    //内部建造者类,采用方法链式的写法
    public static class Builder{
        private String cpu;
        private String memory;
        private String disk;

        public Builder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        public Builder memory(String memory) {
            this.memory = memory;
            return this;
        }

        public Builder disk(String disk) {
            this.disk = disk;
            return this;
        }

        //定义方法返回要建造的实例
        public Phone build(){
            return new Phone(cpu,memory,disk);
        }


    }
}

2、测试使用带方法链的内部建造者类来实例化Phone对象

package com.bran.builder.type1;

public class BuilderTest2 {

    public static void main(String[] args) {
        Phone phone = Phone.builder()
                .cpu("骁龙855")
                .memory("3g")
                .disk("128g")
                .build();
        System.out.println(phone.toString());
    }
}

3、 lombok包的@Builder注解也可以帮我们实现一个带方法链的内部建造者类的建造者模式,只需要在该实体类上加上@Builder注解就可以了,如下:

package com.bran.builder.type1;

import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Phone {
    private String cpu;
    private String memory;
    private String disk;
}

      加上这个@Builder注解就可以在编译过程中重新对Phone类中的代码构建,生成一个带有方法链的内部建造者类,我们就可以直接使用来实例化Phone对象了,实例化对象的测试代码跟上面第二步的一样。

你可能感兴趣的:(Java设计模式————建造者模式(带方法链的内部建造者类))