Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >6.设计模式--建造者模式(Builder模式)

6.设计模式--建造者模式(Builder模式)

作者头像
大猫的Java笔记
发布于 2021-09-29 07:46:41
发布于 2021-09-29 07:46:41
5890
举报
文章被收录于专栏:大猫的Java笔记大猫的Java笔记

1.场景

建造者模式也是一种创建型模型,是将一个复杂的对象的构建与他的表示分离。

举个例子:比如我要写一本书那么写这个书需要书名、作者、标题、内容等,但是这本书要创作完成需要一个人来创作吧,当然这个人就是作者,也可能不是(比如蹭书的编写作者)。至于这个书该怎么写是先写标题还是先写作者或者是内容这个是构建者(作者)来决定的。

建造者模式大多数情况下,都是通过静态内部类来进行实现的。例如现在有一个小说书类,有4个属性name、author、title、content分别表示书名、作者、标题、内容。但是我们要求的是书名和作者必须要有。于是就有了下面的方式进行构建

1.通过构造方法实现

但是存在一个问题,当我要使用得时候,都要去看一下有那些构造方法可以使用,同时还要确定每个属性是什么意思,如果属性太多同时构造方法太多得时候,看着是比较麻烦的。

2.JavaBean实现

此时就不存在说调用构造方法不知道用哪一个了,直接使用set方法。但是你会发现一旦字段过多的时候,调用set的时候我们自己也很容易遗忘,以及执行的顺序没有可控制性。

3.使用建造者静态内部类方式

此看到这个你可能非常熟悉,这不就是lombok中的@builder注解的使用方式吗?没错实际上lombok也是使用的静态内部类的建造者模式实现的。

此时有没有发现你不需要关注构造方法,同时代码变成了链式编程,但是依然没办法解决执行顺序的问题,以及漏写的问题。

2.传统建造者模式结构图

Builder扮演的是建造者的角色,用于定义建造所需要的方法,NovelBuilder扮演的是具体的建造者角色是对Builder的具体实现,而Novel则是具体要构建的产品例如我们的小说,Director表示的是监工角色,用来规定作者写书的顺序,以及书的创建过程。

3.传统建造者模式实现

Builder扮演的是建造者的角色,用于定义建造所需要的方法。其中包括了书的标题,内容,编写完毕以及获取具体的书等方法。而具体的实现则是交给子类。

NovelBuilder是具体的建造者角色是对Builder的具体实现,是对Novel进行具体的赋值已经构建。

Director扮演的是建工的角色,对具体的构建者的具体构建顺序进行实现,也就是小说的编写顺序。

Novel扮演的是具体的产品,也就是我们说的小说,其中包括了小说名、作者、标题、内容。

测试如下,通过创建建工已经具体的构建者,然后通过监工去进行具体的执行顺序,并且通过具体的构建者返回具体的产品,可以看到实际上我们此时构建的顺序以及容易被忽略或者写错的参数全部交给了监工和构建者。

4.JDK中建造者模式实现

JDK中的建造者模式除了之前说的lombok使用静态内部类的方式,还有就是使用StringBuffer类的append方法。

建造者模式优缺点

优点:

1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

2.每一个具体建造者都独立,因此可以方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。

3.可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

4.增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭”。

缺点:

1.当建造者过多时,会产生很多类,难以维护。

2.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,若产品之间的差异性很大,则不适合使用该模式,因此其使用范围受到一定限制。

3.若产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大猫的Java笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式-建造者模式
在软件开发过程中,我们经常面临着构建复杂对象的问题。这些对象可能具有多个属性,并且在创建过程中可能需要进行一系列复杂的初始化步骤。为了简化这个过程,我们可以使用设计模式中的建造者模式。
架构狂人
2023/10/10
2980
设计模式-建造者模式
【详解】JAVA设计模式建造者模式(Builder)
在面向对象编程中,设计模式是一种在特定情况下解决软件设计问题的通用可重用解决方案。设计模式并不是最终的代码或库,而是一种描述在某些情况下如何解决问题的方法。本文将详细介绍Java中的建造者模式(Builder Pattern),并提供一个具体的实现示例。
大盘鸡拌面
2025/01/05
870
23种设计模式之建造者模式
在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由 CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。
Java技术债务
2022/08/09
3580
23种设计模式之建造者模式
设计模式之建造者模式
本文由老王家组装电脑引出——建造者设计模式,详细介绍建造者模式的基本概念和实现代码,为了便于理解建造者模式,我们会对实际应用中的典型案例进行介绍。最后对比工厂模式和建造者模式之间的区别,让我们在实际使用时能更加灵活的选择设计模式。
程序员田同学
2022/08/01
2540
设计模式学习笔记之建造者模式
这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结。 我的个人博客:海加尔金鹰
海加尔金鹰
2020/06/09
3740
设计模式之建造者模式
首先是他的重要性,在effective-java中第二条就建议使用建造者模式,在23种设计模式中,他是一个生产模式,定位十分准确,使用这种模式可以让我们更好的创建一个类,适合什么时候使用,构造方法参数多余四个以及将来可能扩展到四个的时候,生产的时候务必考虑到将来的扩展性,如果初期使用了工厂模式来生产,后期参数增加需要修改,会让工厂模式变得十分尴尬。 其原理是充分利用了java得特性以及语法,建造者模式核心就是this关键字以及内部类,接下来就由一个例子来说明吧,如果我们要创建一个People类,有name,age,weight,height或者更多得属性,如果直接用四个参数得构造方法是非常头疼得,我们需要知道这四个构造参数得顺序以及意义,在开发得时候有代码提示或许好一点,但是维护得时候需要阅读大量代码就非常致命了,回到Buider模式, 和普通类得区别是,我们需要一个public static final修饰得Buider内部类,public是为了People类能访问到,静态是为了不用声明内部类,final修饰是为了保证不可变,(老实说,作者此处也没具体注意到final得作用,只明白static final是一种常见甚至是必须得修饰),Buider类也需要和People一样得私有属性,给每一个属性添加一个类似set方法得方法,命名直接是属性名即可,参数名统一使用val,返回类型是Builder,我们直接返回this即可,最后需要一个返回类型是People,参数是Builder无参构造方法,return new People(this),此处this就是这个内部类,细心得读者可能发现了People类并没有这个方法,于是我们需要给People添加一个参数是Builder的构造方法,直接将Build的属性赋值给People类,此时完成了建造者模式,达到链式编程的目的。 内部类方法参数使用val是为了和其他区分,是一种良好的编程习惯,final修饰内部类或许是保证了每个赋值方法返回的this是同一个this吧 完整代码如下:这只是一个示例,在具体使用中可灵活变换,比如在外部类使用带参构造先赋值两个参数
一只
2023/08/10
1320
设计模式的征途—6.建造者(Builder)模式
建造者模式又称为生成器模式,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。因为,没有人买车会只买一个方向盘或者轮胎,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件组成的完整汽车。如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题。
Edison Zhou
2018/08/20
3770
设计模式的征途—6.建造者(Builder)模式
Java设计模式:建造者模式之经典与流式的三种实现(四)
开发中,我们经常需要创建具有多个属性或配置选项的复杂对象。直接通过构造函数或大量的setter方法来设置这些属性可能会导致代码的可读性和维护性下降。建造者模式通过提供一个建造者类来封装复杂对象的创建过程,使得客户端代码可以更加简洁和清晰地构建对象。
公众号:码到三十五
2024/03/19
3840
Java设计模式:建造者模式之经典与流式的三种实现(四)
23种设计模式,建造者模式实战
建造者模式是一种对象创建型设计模式,用于创建复杂对象。其核心思想是将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常包括一个Director类,用于管理构建过程,和多个Builder类,每个Builder负责构造复杂对象的一部分。
小马哥学JAVA
2024/04/06
2350
王者荣耀之「建造者模式」
最近看了陈宇明老哥的英雄联盟之「策略模式」和王者荣耀之「装饰者模式」。作为日常上王者的我看完以后还是很惊(bu)喜(xie)的。什么?日常上王者不知道什么意思?
陈宇明
2020/12/15
7880
王者荣耀之「建造者模式」
设计模式【4】-- 建造者模式详解
<img src="https://markdownpicture.oss-cn-qingdao.aliyuncs.com/blog/设计模式.png" style="zoom: 33%;" >
秦怀杂货店
2021/12/02
2000
建造者模式的运用
* **分离**了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。
忆愿
2024/08/05
930
建造者模式的运用
【设计模式】之建造者模式
建造者模式属于创建型模式的一员,可以控制对象的实例化过程。 建造者模式简化了复杂对象的实例化过程。 建造者模式的经典定义如下:
青山师
2023/05/05
2030
【设计模式】之建造者模式
Java设计模式(二)----建造者模式
建造者模式 一、概念 1、产品的内部表象 2、对象性质的建造 二、建造模式的结构 三、建造模式分成两个很重要的部分 四、使用场景 五、使用建造模式构建复杂对象 一、概念  建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。 1、产品的内部表象   
汤高
2018/01/11
1K0
Java设计模式(二)----建造者模式
建造者模式(Builder)及其应用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/52124383
程序员徐公
2018/09/18
1.6K0
建造者模式(Builder)及其应用
「聊设计模式」之建造者模式(Builder)
🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!
bug菌
2023/11/07
9011
「聊设计模式」之建造者模式(Builder)
漫谈模式之建造者模式(由来和通用写法)
今天我们分享另外一个创建型的模式:建造者模式。在讲解建造者模式之前,我们首先来看一个需求示例。
孟君
2023/03/03
3820
建造者模式【建造者模式设计模式】
指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
高大北
2022/06/14
4790
设计模式系列整理-02-建造者模式
包括 Builder、ConcreteBuilder、Director、Product 等部分
编程思维
2023/04/11
2841
设计模式系列整理-02-建造者模式
『设计模式』麦当劳的秘密建造者模式
先把构建过程独立出来,在建造者模式中把它称为指导者,由他来知道装配过程。但不负责每步具体的实现。 要有能具体实现每步的对象,称之为建造者或者生成器。
风骨散人Chiam
2020/10/28
3400
推荐阅读
相关推荐
设计模式-建造者模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档