设计模式之建造者模式

发布于:2025-03-21 ⋅ 阅读:(21) ⋅ 点赞:(0)

       

目录

1. 概念

2. 代码实现

3. 应用场景


        建造者模式(Builder)是创建型设计模式的最后一个,但是确实在平时开发过程中或者阅读源码过程中是十分常见的,难度在我来看是比较适中的,理解起来的也比较轻松,并且平时我们在编码过程中也可以灵活的运用它。

1. 概念

        建造者模式允许你通过一步一步构建复杂对象的过程来创建不同的表示。这种模式将复杂的构造逻辑封装在单独的类中(即建造者),从而使主类可以专注其自身的职责。以下是建造者模式的一些关键点:

  • 分离复杂对象的构建过程:将复杂对象的构建过程与它的表示分离
  • 控制对象的创建步骤:允许以不同的顺序或方式构建对象
  • 避免构造函数参数过多:当一个类有多个构造参数时,使用建造者模式可以使代码更清晰

2. 代码实现

这里我们以建造一个Phone类为例,Phone中有cpu、mem、disk、camera属性(如上述类图所示),那么我们创建对象时,其实对于属性的构建顺序是没有要求的,同时它的属性也较多,我们就可以使用建造类对其的创建方式进行分离。

AbstractPhoneBuilder类(注意,这里的抽象类只是为了更规范,其实你可能发现有没有此类都不会影响实现)

/**
 * 抽象建造者
 */
public abstract class AbstractBuilder  {

    Phone phone;
    abstract AbstractBuilder customCpu(String cpu);
    abstract AbstractBuilder customMem(String mem);
    abstract AbstractBuilder customDisk(String disk);
    abstract AbstractBuilder customCam(String cam);

    Phone getProduct(){
        return phone;
    }


}

Phone类

public class Phone {

    protected String cpu;
    protected String mem;
    protected String disk;
    protected String cam;

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

    public String getCpu() {
        return cpu;
    }

    public String getMem() {
        return mem;
    }

    public String getDisk() {
        return disk;
    }

    public String getCam() {
        return cam;
    }
}

XiaoMiBuilder类

public class XiaomiBuilder  extends AbstractBuilder{


    public XiaomiBuilder(){
        phone = Phone.builder().build();
    }

    /**
     *
     * @param cpu
     */
    @Override
    AbstractBuilder customCpu(String cpu) {
        phone.cpu = cpu;
        return this;
    }

    @Override
    AbstractBuilder customMem(String mem) {
        phone.mem = mem;
        return this;
    }

    @Override
    AbstractBuilder customDisk(String disk) {
        phone.disk = disk;
        return this;
    }

    @Override
    AbstractBuilder customCam(String cam) {
        phone.cam = cam;
        return this;
    }
}

MainTest类

public class MainTest {

    public static void main(String[] args) {

        AbstractBuilder builder = new XiaomiBuilder();


        //建造这个手机
//        builder.customMem("16G");
//        builder.customDisk("1T");
//        builder.customCam("2亿");
//        builder.customCpu("骁龙8个8");


        //链式建造者 Swagger

        Phone phone = builder.customCpu("骁龙8个8")
                .customCam("2亿")
                .customDisk("1T")
                .customMem("16G")
                .getProduct();
        System.out.println(phone);


        Phone build = Phone.builder()
                .cpu("1")
                .mem("2")
                .cam("3")
                .disk("4")
                .build();

        System.out.println(build);


    }
}

        以上我们可以看到,我们其实实现了一种链式调用的方式,这样方便开发者可以快速的通过层层构建直接创建出我们的对象,其实在一些源码或者开源的项目中,大家都采取了这种方式来进行调用,大大简化了代码的复杂度。

        同时,其实如果你作为一位经验丰富的开发者,你会知道在lombok这个插件中,我们可以在实体类上加入@Builder注解后,lombok就会自动为我们添加此类的建造者的创建方式,这样在一些简单的业务场景下,大大提高了开发人员的效率。

3. 应用场景

        建造者模式我开篇就提到了其在源码的常见程度,所以我列举一些常见的应用:

  • StringBuilder类
  • Swagger中的ApiBuilder
  • 阿里云或者腾讯云中第三方的请求构建等
  • ...