当前位置: 首页 > news >正文

《java与模式》学习系列——建造者模式

 

一、 建造(Builder)模式结构图

建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割分开,达到责任划分和封装的目的。

建造模式利用一个导演者对象和具体建造者对象一个一个的建造出所有零件,从而建造出完整的产品对象。

结构图如下:

二、 建造模式在java中的应用

JavaMail中的建造模式

JavaMail是一组J2SE的扩展API的一个类库,设计师可以使用它很容易的开发出功能齐备的客户端电子邮件软件。

JavaMail中的MessageMimeMessage等类均是退化的建造模式的应用。作为客户端和导演对象,MailSender通过一步步的提供MimeMessage对象的“零件”性质,也就是fromrecipientsubjecttext等,最后得到整个的产品对象,也就是MimeMessage对象。

代码如下:

 

三、 在什么情况下使用建造者模式

1、  需要生成的产品对象有复杂的内部结构。每一个内部成分本身可以是对象,也可以是一个对象(即产品对象)的一个组成部分。

2、  需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式便是一个很好的设计思想。

3、  在对象创建过程中会使用到系统中的其他一些对象,这些产品对象的创建过程不易得到。

四、 建造模式与其他模式的关系

建造模式与抽象工厂模式的区别

在抽象工厂模式中,每一次工厂对象被调用时都会返还一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。建造类则不同,它一点一点的建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色内部。建造者模式的客户端拿到的是一个完整的最后产品。

换言之,虽然抽象工厂模式与建造模式都是设计模式,但是抽象工厂模式处在更加具体的尺度,而建造模式则处于更加宏观的尺度上。一个系统可以有一个建造模式和一个抽象工厂模式组成,客户端通过调用这个建造角色,间接的调用另一个抽象工厂模式的工厂角色。工厂模式返还不同产品组的零件,而建造者模式则把它们组装起来。

建造模式与策略模式

建造模式在结构上很接近于策略模式,事实上建造模式是策略模式的一种特殊情况,这两种模式的区别在于他们的用意不同。建造模式适用于为客户端一点一点的建造新的对象,而不同类型的具体建造者角色虽然都拥有相同的接口,但是他们所创建出来的对象则可能完全不同。

策略模式的目的是为算法提供抽象的接口。换言之,一个具体策略类把一个算法包装到一个对象里面,而不同的具体策略对象为一种一般性的服务提供不同的实现。

 

相关文章:

  • 【PL/SQL练习】基本的PL/SQL语句
  • 《java与模式》学习系列——原始模型模式
  • 20145326蔡馨熠《信息安全系统设计基础》第11周学习总结
  • 《java与模式》学习系列——合成模式
  • 【数据结构】简单谈一谈二分法和二叉排序树BST查找的比较
  • 《java与模式》学习系列——代理模式
  • 5种必知的大数据处理框架技术
  • 《java与模式》学习系列——策略模式
  • mysql:字符串转换为日期类型
  • 《java与模式》学习系列——模版方法模式
  • 《java与模式》学习系列——备忘录模式
  • 向量加减法运算及其几何意义
  • 关于 Java 中 finally 语句块的深度辨析
  • Linux 基础(一)
  • Windows 7 应用程序exe图标丢失的修复
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 「译」Node.js Streams 基础
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • ECMAScript入门(七)--Module语法
  • go append函数以及写入
  • go语言学习初探(一)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Windows Containers 大冒险: 容器网络
  • 工作中总结前端开发流程--vue项目
  • 基于Android乐音识别(2)
  • 前端
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信开源mars源码分析1—上层samples分析
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • Python 之网络式编程
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (1)bark-ml
  • (4.10~4.16)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)http协议
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 发展历程
  • .NET 反射的使用
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)