设计模式:不可变的嵌入式构建器

上周,我写了关于什么使图案成为反图案。 本周,我提出一种设计模式…或等待……也许这是一种反模式。 还是? 让我们看看!

当有一个类可以构建另一个实例时,构建器模式是一种编程样式。 构建器模式的最初目的是将对象的构建过程(在某些情况下可能非常复杂)与对象本身的类分开,因此构建器可以根据构建过程的进行方式交付不同类型的对象。 这是关注点分离的一个明显例子。

不可变的对象是创建的对象,在创建过程后不能更改。

建造者和不可变的对象自然而然地融合在一起。

生成器和生成的对象紧密相关,因此通常将它们放在同一程序包中。 但是为什么要在单独的类中实现它们? 一方面:它们当然必须是单独的类。 这就是全部。 但是另一方面:为什么构建器不能成为已构建类的内部类? Builder通常会以其自己的状态收集建筑物信息,并且在调用方请求构建对象时,该信息将用于构建已构建的对象。 大多数情况下,这种“使用”是复制操作。 如果生成器是内部类,则所有这些信息都可以存储在生成的对象中。 注意,内部类可以访问嵌入它的类的所有私有部分。 构建器可以创建尚未准备好的构建对象,并将构建信息存储在其中。 当要求建造所有东西时,便是最后的油画。

此模式后面是番石榴的不可变集合。 构建器是静态内部类。 如果查看ImmutableList的代码,您会发现抽象类内部有一个内部Builder类。

但这不是嵌入构建器和实现的唯一方法。 如果将实现嵌入到生成器中怎么办? 构建器是唯一需要对类进行可变访问的代码。 定义该类实现的查询方法的接口对于其他任何人都应该足够。 如果我们到了这一点,为什么不创建Matrjoschka?

让我们有一个接口。 让我们在接口内部将内部生成器作为内部类(默认情况下为静态和公共,不能以任何其他方式)。 让我们将构建器内部的实现作为实现外部接口的私有静态类。

public interface Knight {boolean saysNi();public class Builder {private Implementation implementation = new Implementation();public Builder setState(String say) {implementation.say = say;return this;}public Implementation build() {Implementation knight = implementation;implementation = null;return knight;}private static class Implementation implements Knight {private String say;public boolean saysNi() {return say.indexOf("ni") != -1;}}}
}

构建器可以访问Knight实施的任何字段,因为它们在同一顶级类中。 (JLS1.7,第6.6.1节确定可访问性)

除了使用生成器之外,没有其他方法(讨厌的反射技巧或字节码滥用(目前已超出范围))可以访问实现。

该构建器可用于构建实现,一旦返回该实现,就无法再对其进行访问,因此无法通过该构建器修改该实现。 如果实现是不可变的,则可以保证保存状态。

这是图案还是反图案?

参考: 设计模式:来自Java博客Jeep的JCG合作伙伴 Peter Verhas的不可变嵌入式构建器 。

翻译自: https://www.javacodegeeks.com/2014/02/design-pattern-immutable-embedded-builder.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Outlook邮件的右键菜单中添加自定义按钮

customUI代码如下&#xff1a; <customUI xmlns"http://schemas.microsoft.com/office/2009/07/customui"><contextMenus><contextMenu idMso"ContextMenuMailItem"> <button id"button1" label"修改件名"…

vue 项目的I18n国际化之路

I18n (internationalization ) ---未完善 产品国际化是产品后期维护及推广中重要的一环&#xff0c;通过国际化操作使得产品能更好适应不同语言和地区的需求 国际化重点&#xff1a;1、 语言语言本地化2、 文化颜色、习俗等3、 书写习惯日期格式、时区、数字格式、书写方向备…

华中师范大学邮箱matlab,18春[华中师范大学]华师《Matlab基础与应用》在线作业1(100分)...

试卷总分:100 得分:100第1题,用round函数四舍五入对数组[2.48 6.39 3.93 8.52]取整&#xff0c;结果为( )。A、[2 6 3 8]B、[2 6 4 8]C、[2 6 4 9]D、[3 7 4 9 ]第2题,下列变量名中( )是合法的。A、char_1B、x*yC、x\yD、end第3题,指出下列错误的指令是( )。A、syms a b;…

nginx 篇

nginx 安装 下载必要组件 nginx下载地址 http://nginx.org/en/download.htmlpcre库下载地址&#xff0c;nginx需要 http://sourceforge.net/projects/pcre/files/pcre/zlib下载地址&#xff0c;nginx需要 http://www.zlib.net/openssl下载地址&#xff0c;nginx需要 https://gi…

使用IAM保护您的AWS基础架构

在开发新产品并发现合适的产品市场时&#xff0c;每个团队都需要快速行动。 尤其是初创公司&#xff0c;因为公司的整个未来都取决于快速找到为您的产品付款的人。 对于初创企业和其他团队来说&#xff0c; Amazon Web Services是令人难以置信的工具&#xff0c;可以快速构建其…

Linux命令集锦:tmux命令

tmux是一款优秀的终端复用软件&#xff0c;平时用到的强大功能有下面两个&#xff1a; 窗口管理&#xff1a;同时启用多个窗口&#xff1b; 保护现场&#xff1a;连接到远程主机之后&#xff0c;一旦断开&#xff0c;那么当前账户登录的任务就被取消了&#xff0c;但是使用 tmu…

一个页面从输入URL到加载显示完成,发生了什么?

面试经典题——URL加载 一、涉及基本知识点&#xff1a; 1. 计算机网络 五层因特尔协议栈&#xff1a; 应用层&#xff08;dns、http&#xff09;&#xff1a;DNS解析成IP并完成http请求发送&#xff1b;传输层&#xff08;tcp、udp&#xff09;&#xff1a;三次握手四次挥手…

mysql文件软连接失败,解决打包软链接打包失败问题

一般情况下打包文件时&#xff0c;如果直接打包软连接会导致打包失败&#xff0c;即没有将要打包的内容打包进去&#xff0c;这里提供tar打包参数-h[rootlocalhost ~]# ll /etc/rc.locallrwxrwxrwx. 1 root root 13 Nov 24 00:45 /etc/rc.local -> rc.d/rc.local[rootlocalh…

快速掌握前端 专为Java程序员定制

Javascript 例子 修改页面内容 js 代码位置 <script>// js 代码 </script>引入 js 脚本 <script src"js脚本路径"></script>注意&#xff0c;到了框架之后&#xff0c;引入方式会有不同 1. 变量与数据类型 声明变量 1) let ⭐️ l…

实施Jersey 2 Spring集成

Jersey是Oracle提供的出色的Java JAX-RS规范参考实现。 去年&#xff0c;当我们开始为大容量网站构建RESTful后端Web服务时&#xff0c;我们选择使用JAX-RS API作为我们的REST框架和Spring框架来进行依赖项注入。 泽西岛是我们选择的JAX-RS实现。 项目启动时&#xff0c;JAX-R…

Solidity中如何判断mapping中某个键是否为空呢?

Solidity中如何判断mapping中某个键是否为空呢&#xff1f; 一.比较标准的做法是建立一个专门和value相关的结构体&#xff0c;用一个布尔型变量来看是否这个key所对应的value被赋过值 代码如下&#xff1a; pragma solidity ^0.4.19;contract UserTest {struct User{string na…

Angular网络请求的封装

很多时候&#xff0c;我很喜欢angular的编码风格&#xff0c;特别是angular支持typescript之后&#xff0c;完整的生命周期&#xff0c;完美的钩子函数&#xff0c;都是别的语言所无法替代的。这里我来说说我自己的网络请求封装&#xff0c;某种意义上来说&#xff0c;angular自…

mac安装了多版本php 卸载,mac 安装多版本PHP

前言相信大家在mac 安装PHP多版本的时候也遇到了很多坑# brew install php56# brew install php70这样安装的话肯定会报错的&#xff0c;因为brew存在软连接这个时候我们第一步&#xff1a;brew unlink php56 或者 brew unlink php70这个步骤是关闭掉PHP的软连接第二步&#x…

新国标电动自行车目录库

浙江&#xff1a;https://xzsp.zjidb.com/api/bicycle 上海&#xff1a;http://www.shbicycle.com/info.asp 北京&#xff1a;http://wfcxjk1.bjjtgl.gov.cn/fjdcml/fjdcListM.jsp 安徽&#xff1a;http://ddch.aqi.ah.cn/index_GB17761-1999.asp 3C查询&#xff1a;http://ccc…

HTML | CSS | JavaScript 常见错误

持续更新 超链接鼠标悬浮后的状态 a:hover 拼写图片文件的路径问题转载于:https://www.cnblogs.com/lcchy/p/10139389.html

隐藏的东西? 您需要HiddenSidesPane

我的甘特图用户之一希望在屏幕上使用尽可能多的空间&#xff0c;并询问是否可以删除滚动条。 但是&#xff0c;如何在没有滚动条的情况下进行导航&#xff1f; 好的&#xff0c;有各种各样的键盘快捷键&#xff0c;当然还有FlexGanttFX支持的普通鼠标拖动&#xff0c;但是大多数…

jQuery的on绑定click和直接绑定click区别

状况之外 在之前的公司并没有遇到这个问题&#xff0c;也就没有深究。直到自己换了现在的公司&#xff0c;刚来第二天就开始写别人写到一半的项目&#xff0c;很无奈&#xff0c;不是原生就是jquery&#xff0c;由于项目急&#xff0c;已经来不及切换框架重新布局&#xff0c;只…

php教程哪个软件好,写php用哪款软件好?解决方法

写php用哪款软件好&#xff1f;现在用php-eclipse&#xff0c;但是感觉不太好用js、html、css的提示功能没有&#xff0c;要装插件&#xff0c;装了很久没装上。想问一下现在开发php哪款软件好大家指导一下&#xff0c;谢谢------解决方案--------------------如果要js、html、…

循环数组对象 php,PHP循环遍历stdClass对象的数组

我有一个在MySQL中运行的查询,它返回一个结果作为stdClass对象,如下所示&#xff1a;array(8){[0]>object(stdClass)#36(1){["color"]>string(7)"#a0a0a0"}[1]>object(stdClass)#35(1){["color"]>string(7)"#e0e0e0"}[2]&…

js实现复制粘贴功能

在项目中使用到复制粘贴功能&#xff0c;虽然网上有很多大牛封装了很多的插件&#xff0c;但是还是想不去使用插件&#xff0c;就像自己来实现这个功能。 初步想法&#xff1a; 1. 获取到需要复制的内容&#xff0c;这里我可以将需要复制的内容放在input或者textarea的value中&…