专栏首页Java架构师学习程序员内功心法【设计模式】之建造者模式

程序员内功心法【设计模式】之建造者模式

基本定义

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

建造者模式构建复杂对象就像造汽车一样,是一个一个组件一个一个步骤创建出来的,它允许用户通过制定的对象类型和内容来创建他们,但是用户并不需要知道这个复杂对象是如何构建的,它只需要明白通过这样做我可以得到一个完整的复杂对象实例。

模式结构

Builder:抽象建造者。它声明为创建一个Product对象的各个部件指定的抽象接口。

ConcreteBuilder:具体建造者。实现抽象接口,构建和装配各个部件。

Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

Product:产品角色。一个具体的产品对象。

模式实现

Product 产品角色

Builder 抽象建造者

ConcreteBuilder 具体建造者

卡车

巴士

Director 指挥者

测试类

输出结果

INFO com.yanyuan.gof.build.builder.v2.TruckBuilder - 制造1000马力发动机

INFO com.yanyuan.gof.build.builder.v2.TruckBuilder - 制造高强度车架

INFO com.yanyuan.gof.build.builder.v2.TruckBuilder - 制造2个座位

INFO com.yanyuan.gof.build.builder.v2.TruckBuilder - 制造12个车轮

INFO com.yanyuan.gof.build.builder.v2.Test - 卡车制造完成:Car{engine=‘1000马力发动机’, seats=‘2个座位’, wheels=‘12个车轮’, frame=‘高强度车架’}

INFO com.yanyuan.gof.build.builder.v2.Test - ------------我是分割线------------

INFO com.yanyuan.gof.build.builder.v2.BusBuilder - 制造200马力发动机

INFO com.yanyuan.gof.build.builder.v2.BusBuilder - 制造高强度车架

INFO com.yanyuan.gof.build.builder.v2.BusBuilder - 制造19个座位

INFO com.yanyuan.gof.build.builder.v2.BusBuilder - 制造4个车轮

INFO com.yanyuan.gof.build.builder.v2.Test - 巴士制造完成:Car{engine=‘200马力发动机’, seats=‘19个座位’, wheels=‘4个车轮’, frame=‘高强度车架’}

优点

将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对象的产生过程。

将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。

每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。

缺点

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

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

使用场景

需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。

隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

总结

建造者模式是将一个复杂对象的创建过程给封装起来,客户只需要知道可以利用对象名或者类型就能够得到一个完整的对象实例,而不需要关心对象的具体创建过程。

建造者模式将对象的创建过程与对象本身隔离开了,使得细节依赖于抽象,符合依赖倒置原则。可以使用相同的创建过程来创建不同的产品对象。

JDK源码

AbstractStringBuilder 抽象建造类

StringBuilder 具体建造类

StringBuffer 具体建造类

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 精讲Redis内存模型一、Redis内存统计二、Redis内存划分三、Redis数据存储的细节四、Redis的对象类型与内部编码五、应用举例

    Java架构
  • 分布式锁的技术选型及思考锁和分布式锁总结参考

    本文来自作者 一行 在 GitChat 分享的{分布式锁的技术选型及思考} 锁和分布式锁 在计算机中,锁的作用是解决在并发状态下的共享资源互斥问题,保证在...

    Java架构
  • 把项目迁移到Kubernetes上的5个小技巧

    我们将在本文中提供5个诀窍帮你将项目迁移到Kubernetes上,这些诀窍来源于过去12个月中OpenFaas社区的经验。下文的内容与Kubernetes 1....

    Java架构
  • JVM | OOP-Klass 二分模型

    oopsHierarchy: 描述了对象的表示层次,描述了klass的表示层次,并为OOPS指针oopDesc* 定义了别名

    微笑的小小刀
  • 经验分享 | 如何写好数据分析师简历?

    我们要确定怎么样简历是一份好数据分析师简历呢?那我们就要涉及到如何评价一个好数据分析师?一般来说,优秀的数据分析师有着很好的表达能力,能通过在二分钟对自己工作内...

    用户2769421
  • HDUOJ---(1995)汉诺塔V

    汉诺塔V Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java...

    Gxjun
  • URI设计原则,你设计的API做到了么?

    咱们设计的REST API真的nice么? 优雅型:http://api.exapmle.com/louvre/da-vinci/mona-lisa 卢浮宫...

    架构师之路
  • VBA 窗体增加最小化按钮

    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVa...

    巴西_prince
  • Python实现简单的API

    py3study
  • Python实现简单的API接口

    py3study

扫码关注云+社区

领取腾讯云代金券