资讯专栏INFORMATION COLUMN

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

wind3110991 / 2551人阅读

摘要:上期原型模式发布以后,收到了粉丝的感谢,一条创作的动力更足了。今天我们一块看一下建造者模式,同样是创建型设计模式。为我们提供了建造者模式的快速实现,要应用到实际编码中。

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

作者其它优质专栏推荐:

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

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

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

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

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


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

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

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

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

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

定义

官方定义

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

通俗解读

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

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

结构图

代码演示

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

目录结构

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

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

pom如下

    <dependency>        <groupId>org.projectlombokgroupId>        <artifactId>lombokartifactId>        <version>1.16.10version>    dependency>

开发场景

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

代码演示

1.创建手机类

@Datapublic 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@AllArgsConstructorpublic 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学习资料——回复「资料」
?算法:视频书籍——回复「算法」

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121680.html

相关文章

  • 设计模式建造模式

    摘要:建造者实现抽象类的所有未实现的方法,具体来说一般是两项任务组建产品返回组建好的产品。 0x01.定义与类型 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 用户只需指定需要建造的类型就可以得到他们,建造过程及细节不需要知道 类型:创建型 实现建造模式的两种方式 1.抽象建造者 UML: showImg(https://segmentfault.co...

    banana_pi 评论0 收藏0
  • 从ES6重新认识JavaScript设计模式(三): 建造模式

    摘要:书籍建造者类调用建造者高效能人士的七个习惯史蒂芬柯维励志上面的这个类和第一个例子的效果一样,但是长度确减少不少,在有更多属性的时候,减少的代码量会更为明显。参考内容设计模式张容铭 showImg(https://segmentfault.com/img/remote/1460000015147692); 1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表...

    hatlonely 评论0 收藏0
  • 从ES6重新认识JavaScript设计模式(三): 建造模式

    摘要:书籍建造者类调用建造者高效能人士的七个习惯史蒂芬柯维励志上面的这个类和第一个例子的效果一样,但是长度确减少不少,在有更多属性的时候,减少的代码量会更为明显。参考内容设计模式张容铭 showImg(https://segmentfault.com/img/remote/1460000015147692); 1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表...

    yuanxin 评论0 收藏0
  • Java设计模式-建造模式

    摘要:在建造者模式比较庞大时,导演类可以有多个。该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计的最初目标。源码地址参考文献设计模式之禅 定义 Separate the construction of a complex object from its representation so that the same...

    txgcwm 评论0 收藏0

发表评论

0条评论

wind3110991

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<