当前位置: 首页 > news >正文

设计模式之建造者模式

       

目录

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
  • 阿里云或者腾讯云中第三方的请求构建等
  • ...

相关文章:

  • 【深度学习入门_机器学习理论】支持向量机(SVM)
  • 【总结】Pytest vs Behave,BDD 测试框架哪家强?
  • SpringSecurity配置(自定义认证过滤器)
  • 基于deepseek的智能语音客服【第三讲】知识库封装
  • Rust会取代Java吗?Rust与Java对比
  • 【商城实战(49)】解锁小程序端适配与优化,让商城飞起来
  • druid开启防火墙之后的bug
  • 【MySQL】架构
  • 从基础到实践(十九):DC/DC由来和工作原理介绍
  • 数据源支持远程Excel/CSV,数据集支持分组字段功能,DataEase开源BI工具v2.10.6 LTS版本发布
  • YOLO11报错:AttributeError: module ‘torch‘ has no attribute ‘OutOfMemoryError‘
  • Pytorch使用手册—自定义函数的双重反向传播与自定义函数融合卷积和批归一化(专题五十二)
  • 蓝桥杯算法分享:征服三座算法高峰
  • TensorFlow 的基本概念和使用场景
  • 该错误是由于`KuhnMunkres`类未定义`history`属性导致的
  • 【橘子websocket】如何基于vertx来构建websocket聊天室(上)
  • JS—原型与原型链:2分钟掌握原型链
  • 《AI大模型开发笔记》——企业RAG技术实战
  • 【杂记二】git, github, vscode等
  • 2025火狐插件被禁用解决方案 could not be verified for use in Firefox and has been disabled
  • 今年地质灾害防治形势严峻,哪些风险区被自然资源部点名?
  • 特朗普签署行政命令推动深海采矿,被指无视国际规则,引发环境担忧
  • 昆明一小区电梯突然从40楼降到负4楼,回应:临时断电引起
  • 青海西宁市公安局原党委委员、副局长王小华被“双开”
  • 天问三号开放20千克质量资源,邀国际合作开展火星探测研究
  • 停止水资源共享、驱逐武官,印度对巴基斯坦宣布多项反制措施