《源码中的设计模式》之建造者模式——链式调用

发布时间:2022-07-04 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了《源码中的设计模式》之建造者模式——链式调用脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

🌲本文收录于专栏《码中的设计模式》——理论与实战的完美结合

作者其它优质专栏推荐F1a;

📚《技专家修炼》——搞技术,进大厂,聊人生三合一专栏

📚《leetcode 300题》——每天一道算法题,进大厂必备

📚《糊涂算法》——从今天起,迈过数据结构和算法这道坎

📚《从实战学python》——Python的爬虫,自动化,ai等实战应用(代码开源)

点击跳转到文末领取粉丝福利


哈喽,大家好,我是一条~

之前的《白话设计模式》因为工作被搁置,如今再次启航,并搭配框架源码解析一起食用,将理论与实战完美结合。

对设计模式不是很熟悉的同学可以先看一下《23种设计模式的一句话通俗解读》全面的了解一下设计模式,形成一个整体的框架,再逐个击破。

上期原型模式发布以后,收到了粉丝的感谢,一条创作的动力更足了。

《源码中的设计模式》之建造者模式——链式调用

今天我们一块看一下建造者模式,同样是创建型设计模式。

《源码中的设计模式》之建造者模式——链式调用

定义

官方定义

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

通俗解读

提供一种创建对象的方式,创建的东西细节复杂,还必须暴露给使用者。屏蔽过程而不屏蔽细节

类似建房子,只需要把材料和设计图纸给工人,就能建成想要的房子,不关注工人建房子的过程,但对于细节,我们又可以自己设计。

结构图

《源码中的设计模式》之建造者模式——链式调用

代码演示

本文源码:建造者模式 提取码: vpqt

目录结构

建议跟着一条学设计模式的小伙伴都建一个maven工程,并安装lombok依赖和插件。

并建立如下包目录,便于归纳整理。

《源码中的设计模式》之建造者模式——链式调用

pom如下

    <dePEndency>
        <groupId>org.PRojectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
    </dependency>

开发场景

现在有一个手机的建造者,我要让它为我生产不用品牌和配置的手机。该怎么实现?

代码演示

1.创建手机类

@Data
public class Phone {       
        //处理器
        protected String cpu;
        //内存
        protected String mem;
        //磁盘
        protected String disk;
        //屏幕大小
        protected String size;
}

2.创建建造者接口

//定义建造者的模板方法
public interface Builder {
    Phone phone = new Phone();
    void buildCpu(String cpu);
    void buildMem(String mem);
    void buildDisk(String disk);
    void buildSize(String size);

    default Phone getPhone(){
        return phone;
    }
}

3.创建Vivo手机的建造者

public class VivoPhoneBuilder implements Builder{
		//建造者细节的实现
    @override
    public void buildCpu(String cpu) {
        phone.cpu=cpu;
    }

    @Override
    public void buildMem(String mem) {
        phone.mem=mem;
    }

    @Override
    public void buildDisk(String disk) {
        phone.disk=disk;
    }

    @Override
    public void buildSize(String size) {
        phone.size=size;
    }
}

4.创建测试类

public class Maintest {
    public static void main(String[] args) {
        VivoPhoneBuilder builder = new VivoPhoneBuilder();
        builder.buildCpu("888");
        builder.buildDisk("512");
        builder.buildMem("16");
        builder.buildSize("plus");
        Phone phone = builder.getPhone();
        System.out.println(phone);
    }
}

5.输出结果

《源码中的设计模式》之建造者模式——链式调用

如果我这时需要生产OPPO手机,只需新建一个OppoPhoneBuilder实现Builder接口即可。

链式调用

相信大家在开发中都遇见过这样的代码,像链子一样可以一直调用下去。

《源码中的设计模式》之建造者模式——链式调用

那么如何实现链式建造者呢?

有以下两种方式:

1.修改返回值为Builder

public interface Builder {
    Phone phone = new Phone();
    // void 改为 Builder 同步修改实现类
    Builder buildCpu(String cpu);
    Builder buildMem(String mem);
    Builder buildDisk(String disk);
    Builder buildSize(String size);

    default Phone getPhone(){
        return phone;
    }
}

测试1

public class MainTest {
    public static void main(String[] args) {
        // ……

        VivoPhoneBuilder builder2 = new VivoPhoneBuilder();
        Phone phone1 = builder2
                .buildCpu("888")
                .buildDisk("512")
                .buildMem("16")
                .buildSize("plus")
                .getPhone();
        System.out.println("phone1:"+phone1);
    }
}

结果1

《源码中的设计模式》之建造者模式——链式调用

2.使用lombok

@Data
@Builder   //使用链式建造者
@NoArgsConstructor
@AllArgsConstructor
public class Phone {
   // ……
} 

测试2

public class MainTest {
    public static void main(String[] args) {
      
				// ……
      
        Phone build = Phone.builder()
                .cpu("888")
                .mem("16")
                .disk("512")
                .size("plus").build();
        System.out.println("builder:"+build);
    }
}

结果2

《源码中的设计模式》之建造者模式——链式调用

应用场景

  • StringBuilder:append(); 给谁append呢?
    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacITyInternal(count + len);
        str.getchars(0, len, value, count);
        count += len;
        return this;
    }
  • Swagger-ApiBuilder;
  • 快速实现:Lombok-@Builder

总结

建造者模式提供了对于同一构建过程的不同表示,像流水线一样生产对象。对于新增的对象,只需要创建对应的建造者即可,不需要修改源代码。

lombok为我们提供了建造者模式的快速实现(@Builder),要应用到实际编码中。

粉丝福利

📚Java:1.5G学习资料——回复「资料」 📚算法:视频书籍——回复「算法」

👇 点击下方卡片 关注后回复 关键词 👇

脚本宝典总结

以上是脚本宝典为你收集整理的《源码中的设计模式》之建造者模式——链式调用全部内容,希望文章能够帮你解决《源码中的设计模式》之建造者模式——链式调用所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。