博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 设计模式(三)《单例模式》
阅读量:6477 次
发布时间:2019-06-23

本文共 1347 字,大约阅读时间需要 4 分钟。

单例模式

更多设计模式小故事案例代码详解 >><< 设计模式,如此简单~


tags:

  • Java
  • Gang Of Four
  • Difficulty-Beginner(入门级难度)

注:

什么是 GOF(四人帮,全拼 Gang of Four)? 在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。 四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。 对接口编程而不是对实现编程。 优先使用对象组合而不是继承。


所要解决的问题

保证一个类只有一个实例,并且全局可以访问它。

说明

身边的例子

中国只能同时拥有一个国家主席

通俗的讲

要保证始终特定的类只有一个实例

单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

代码实践

Joshua Bloch, Effective Java 2nd Edition p.18

单元素枚举是使用单例模式最佳的实践.

public enum EnumIvoryTower {  INSTANCE;}复制代码

然后我们在使用

EnumIvoryTower enumIvoryTower1 = EnumIvoryTower.INSTANCE;EnumIvoryTower enumIvoryTower2 = EnumIvoryTower.INSTANCE;assertEquals(enumIvoryTower1, enumIvoryTower2); // true复制代码


什么时候使用单例模式

  • 要求生产唯一序列号
  • 需求上必须只能存在一个对象,并且客户端能够从一个公共的地方访问它.
  • 当您想控制实例数目,创建一个对象消耗过多资源,如数据库连接等,节省系统资源的时候.

优缺点

优点:

  1. 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  2. 避免对资源的多重占用(比如写文件操作)。

缺点:

  • 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

典型应用

  • 项目中记录日志的类
  • 数据库连接
  • 我们使用的操作系统的文件管理器

实际应用


结论

  • 有类本身控制创建和销毁,违反了单一职责原则
  • 鼓励使用全局共享实例,防止该对象使用的对象和资源被解除分配。

参考文献

转载于:https://juejin.im/post/5b7e499ef265da43506e90cf

你可能感兴趣的文章
学习iOS【3】数组、词典和集合
查看>>
Hessian 原理分析--转
查看>>
转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
查看>>
easyui传入map的数据前台展示出tree格式数据
查看>>
悲观的思考,乐观的生活.我们既需要思考的深度,也需要生活的温度!
查看>>
java.math.BigDecimal
查看>>
Vitamio中文API文档(4)—— VitamioInstaller
查看>>
yii框架常用url地址
查看>>
python3.4学习笔记(十六) windows下面安装easy_install和pip教程
查看>>
MyGUI 解析
查看>>
Linux中的ls命令详细使用
查看>>
graph-tool文档(一)- 快速开始使用Graph-tool - 2.属性映射、图的IO和Price网络
查看>>
easyui treegrid逐步加载
查看>>
GraphicsLab Project之辉光(Glare,Glow)效果 【转】
查看>>
<转>Python: __init__.py 用法
查看>>
Linux Curl命令
查看>>
046 SparlSQL中的函数
查看>>
-27979 LoadRunner 错误27979 找不到请求表单 Action.c(73): Error -27979: Requested form not found...
查看>>
[LeetCode] Minimum Depth of Binary Tree
查看>>
,net运行框架
查看>>