嵌入式开发环境构建

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

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

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

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

构建器和构建的对象紧密相关,因此通常将它们放在同一程序包中。 但是为什么要在单独的类中实现它们? 一方面:它们当然必须是单独的类。 这就是全部。 但是另一方面:为什么构建器不能成为已构建类的内部类? 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

嵌入式开发环境构建

嵌入式开发环境构建_设计模式:不可变的嵌入式构建器相关推荐

  1. 基于ubuntu的嵌入式开发环境

    基于ubuntu的嵌入式开发环境 1.更新系统源 2.安装嵌入式开发环境(安装嵌入式开发所需工具) 3.安装OPENCV(可选) 4.更新VIM配置 5.虚拟终端路径太长的问题 6.安装nfs和tft ...

  2. VSCode 和 CMake 搭建嵌入式开发环境

    CMake 与 VSCode 搭建 ARM 构建环境 1. 前言 在嵌入式领域能够选择的集成开发环境(IDE)很多,有通用型的,例如 Keil,IAR,给他们安装一个相应芯片的描述包即可开发相应芯片的 ...

  3. 翻译 | 《JavaScript Everywhere》第1章 开发环境(^_^)

    翻译 | <JavaScript Everywhere>第1章 开发环境(^_^) 写在最前面 大家好呀,我是毛小悠,是一位前端开发工程师.正在翻译一本英文技术书籍. 为了提高大家的阅读体 ...

  4. Linux下搭建Cortex-M嵌入式开发环境

    Linux下搭建Cortex-M嵌入式开发环境 终于换上了Linux,更换之前考虑良久,最后选定了Ubuntu15(PS:自己家里用的是Fedora),主要是考虑Ubuntu确实更易用(但明显没有De ...

  5. RedHat 系列 Linux 安装后,建立嵌入式开发环境

    RedHat 系列 Linux 安装后,建立嵌入式开发环境 from:https://segmentfault.com/a/1190000005881355 做开发的时候,经常为了某系列的项目,专门就 ...

  6. Ubuntu Linux 安装后,建立嵌入式开发环境

    Ubuntu Linux 安装后,建立嵌入式开发环境 from:http://xfenglin.com/a/12001485885.html 浏览: 10 发布日期: 2016-08-17 分类: u ...

  7. 华山服务器安装linux系统,RHEL7/Centos7下使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境(2018...

    目录 1交叉编译环境搭建 交叉编译器下载链接: 1.1交叉编译器下载 将其下载到/usr目录下并解压. 解压命令: tar -xvf gcc-linaro-7.2.1-2017.11-i686_arm ...

  8. ubuntu12.04嵌入式开发环境搭建(各种问题、各种配置)

    ubuntu-12.04嵌入式开发环境搭建 先安装ubuntu-16.04  *** 想使用root用户登陆的,操作如下 给root用户设定一个密码 supreme@supreme:~# sudo p ...

  9. 嵌入式linux开发环境 cpu,嵌入式Linux开发环境的搭建之:U-Boot移植-嵌入式系统-与非网...

    5.2  U-Boot移植 5.2.1  Bootloader介绍 1.概念 简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序.通过这段程序,可以 ...

最新文章

  1. 探究被Win7保留的100MB活动分区
  2. python如何返回多个值_python- 如何返回多个值 | 学步园
  3. python与c语言在语法上的区别-Python与C语言基础对比(Python快速入门)
  4. js实现贪吃蛇小游戏
  5. [原]FreeSWITCH uuid_transfer both转移失败(三方通话),如何解决?
  6. Linux操作系统下Sudo命令的使用方法说明
  7. php中删除文件夹内容吗,如何使用PHP删除包含内容的文件夹
  8. 解决在iOS8环境下,当用户关闭定位服务总开关时,无法将APP定位子选项加入定位权限列表的问题...
  9. 使用jdk的xjc命令由schema文件生成相应的实体类
  10. 推荐一款专为新手用的Python开发工具
  11. 单片微型计算机原理及应用第三版课后答案,单片微型计算机原理及应用 - 课后习题答案 - 山东理工...
  12. 常用Win32 API函数
  13. win10查看电脑已连接过的无线密码
  14. 备战软件设计大赛经验分享篇
  15. java十进制转换成二进制
  16. 怎么在不影响视频清晰的条件下把qlv转成mp4格式?
  17. 【不可能不好玩】一个我觉得最好玩的游戏!
  18. wireless communications in smart grid 2
  19. 千里走单骑:02-北京到上海骑记--Day1.首日征程
  20. 新人必学必会的 Linux 命令!

热门文章

  1. codeforces773 D. Perishable Roads(思维+最短路)
  2. codeforces1486 F. Pairs of Paths(倍增+树上数数)
  3. 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)
  4. 线段树-Count on a Treap-神题
  5. Java 非阻塞 IO 和异步 IO
  6. Maven精选系列--继承与聚合
  7. 类、变量、块、构造器、继承初始化顺序,终极解答
  8. Java对象引用四个级别(强、软、弱、虚)
  9. C++描述杭电OJ 2000. ASCII码排序 ||
  10. 使用ueditor实现多图片上传案例——Dao层(BaseDao)