一篇学会建造者模式

  发布时间:2025-11-05 13:39:15   作者:玩站小弟   我要评论
本文转载自微信公众号「三太子敖丙」,作者三太子敖丙。转载本文请联系三太子敖丙公众号。为什么要学设计模式?设计模式有哪些优点?提升查看框架源码能力 提升自己对复杂业务代码设计能力以及cod 。

本文转载自微信公众号「三太子敖丙」,篇学作者三太子敖丙。模式转载本文请联系三太子敖丙公众号。篇学

为什么要学设计模式?模式设计模式有哪些优点?

提升查看框架源码能力 提升自己对复杂业务代码设计能力以及code能力 对今后面试以及职场道路打下扎实的基础

这是我之前写工厂模式的时候给大家提的一些优点,感兴趣的篇学伙伴可以再去复习一下。

今天我们要讲的模式是设计模式中三种模式(创建型模式、行为型模式、篇学结构型模式)中的模式创建型模式中的建造者模式,也可以叫 Builder模式。篇学

与其他的模式创建型模式比如工厂模式一样都是用来服务相同的目标,但是篇学他们的作用场景不一样,实现方式不一样而已,模式但最终的篇学目的都是一个:就是为了让我们写出结构严谨,易懂且易扩展的模式高质量代码。

建造者模式

什么叫建造者?篇学他的IT技术网应用场景又是什么呢?

当我们需要实列化一个复杂的类,以得到不同结构类型和不同的内部状态的对象时,我们可以用不同的类对它们的实列化操作逻辑分别进行封装,这些类我们就称之为建造者。

当我们需要来之同一个类,但是要就有不同结构对象时,就可以通过构造另一个建造者来进行实列化。

----------以上定义来自《设计模式之美》。

为了加深理解我们再来一个流程图

从图中我们主以看出建造者主要分为4种角色:

Product(产品类) :我们具体需要生成的类对象

Builder(抽象建造者类):为我们需要生成的类对象,构建不同的模块属性,即:公开构建产品类的属性,隐藏产品类的其他功能

ConcreteBuilder(具体建造者类):实现我们要生成的类对象

Director(导演类):确定构建我们的类对象具体有哪些模块属性,在实际应用中可以不需要这个角色,直接通过client处理

举例

在电商中有多种不同类型的商品 普通实物商品,电子卡券商品,虚拟视频学习商品 等多种不同的商品,他们都是香港云服务器商品但是他们的属性却不一样,电子卡券:独有券码,学习视频:独有视频链接等。

那我们要怎么实现这种这种创建商品呢?

我们先看下最普通的创建方式:

我们先创建一个基础商品Item类:

这里我们可以看到根据请求类型,也可以完全创建出我们想要的类型商品,但是一个商品属性不可能只有这么一点属性,那以后扩展更多呢?那这个代码我们看上去就会很臃肿,也不好维护。

接下来我们就看下建造者模式怎么去实现:

第一步:创建我们的抽象建造者类。这里面我们看下有三个抽象方法,来确定不同的商品类型,我们调用不同的方法,达到解偶的思想

第二步:创建具体建造者类。对抽象建造者类的抽象方法进行实现赋值,达到我们所需要的结果。

第三步:创建我们的导演类。指导我们怎么去创建对象,这个我们是可以简化的,视具体使用场景确定吧!

最后就是网站模板看我们的测试结果了。在省略导演类的时候其实我们也完全可以的构建出我们想要的结果,因为我这写的是测试demo所以没有写传参,这个大家可以根据自己的实际应用场景去做改造。

与普通的写法相比建造者模式的写法使的这个代码可读性高,而且易扩展,不同类型的商品达到了解耦合的效果。

举例二:

假设我们现在有另外的一种场景,我们复制一个商品时,当没有填写库存时我们默认是0,当用户填写了时我们库存数量不能大于999999999。

那我们要怎么去实现呢?

PS:商品复制这个功能在电商领域是很普通的一个操作,对用户来说简化操作成本,提升用户体检。技术服务于业务,业务决定公司的长远利益

我们在内部创建了一个ItemBuilder,来处理我们的校验逻辑。当然我们使用普通的get,set方式其实也是可以实现的。

看到这里可能有人会问这个与我们使用get或者set方法又有什么区别呢?

解释:主要是为了解决我们的赋值处于一种无效状态

无效状态指的是对象属性之间存在依赖关系,合法校验等,如果使用set方式会导致这种关系和校验得不到验证,所有可能会存在无效的状态,即A、B两个属性必须同时设置,缺一不可,然后set方法可能导致遗漏等

总结

以上就是我要跟大家了解的建造者模式,其实我还是想跟大家分享这种思想吧,像第二个列子大家也可以用于写配置文件(比如我们的链接池,里面很多必填或者不必填参数,同时也可以避免在因为属性值过多而写构造方法时产生不好维护,不雅观的现象)等,因为我一直在电商公司工作,所以我举的列子都是以电商为主。

只有我们了解了每种设计模式解决了什么问题,我们才知道哪种场景用什么模式或者多种设计模式进行组合,避免产生因强行使用设计模式,反而使得代码更加的不好维护了。

  • Tag:

相关文章

  • 长虹电视chiq的优势与特点(一款令人惊艳的智能电视)

    摘要:作为中国领先的电器制造商,长虹电视chiq在市场上享有盛誉。它不仅以其高质量和先进技术赢得了广大消费者的喜爱,而且在智能功能和用户体验方面也独树一帜。本文将重点介绍长虹电视chiq...
    2025-11-05
  • 动图:删除链表的倒数第 N 个结点

    本文转载自微信公众号「程序员小熊」,作者Dine。转载本文请联系程序员小熊公众号。 本文主要介绍一道面试中常考链表删除相关的题目,即 leetcode 19. 删除链表的倒数第 N 个结点。采用 双指
    2025-11-05
  • 谷歌大神又一开源神器!代码调试不选它选谁?

    如果调试是Debug的必经之路,那么编程应该将它考虑在内。今天猿妹就和大家分享一个代码调试神器——Cyberbrain。Cyberbrain是一个免费开源的Python代码调试解决方案,它可视化程序执
    2025-11-05
  • 用autossh工具进行端口转发

    AutoSSH 是一种用以对 SSH 登录进行安全地自动化的软件。比如我们在 host2 机器上面部署了很多服务,但是由于某种原因导致我们无法直接 ssh 访问该服务器已经其上服务的对应端口,但是 h
    2025-11-05
  • 华为V9使用体验大揭秘(真实用户分享,你想了解的一切都在这里)

    摘要:作为一款备受关注的手机产品,华为V9到底如何?它的性能、拍照效果、续航能力等各方面表现如何?为了帮助大家更好地了解华为V9,本文汇集了一些真实用户的使用感受和评价,从不同角度全面展...
    2025-11-05
  • Go 语言的变量与常量

    变量go 语言的变量声明和大多数语言类似,通过 var 关键字声明变量,只是 go 语言作为静态类型语言,声明变量时需要指定其类型。下面的代码表示声明一个『name』变量,类型为『string』,并给
    2025-11-05

最新评论