文档章节

创建型模式之一:单例模式

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:35
字数 591
阅读 19
收藏 1

这是设计模式的一系列文章。我将逐一翻译。 系列地址: http://www.programcreek.com/java-design-patterns-in-stories/ 单例模式是Java中最常用的模式,它通过预防外部实例化与修改用来控制对象数量。这个概念可以推广到系统中,当仅有一个对象,或者限制对象在一定数量之中,操作会会更高效。比如: 

1、私有构造器 - 没有一个其他类能实例化一个新对象。 

2、私有引用 - 没有外部的修改 

3、Public级别的方法是唯一获取对象的地方。

单例模式的故事

这里有一个简单的用例:一个国家只能有一个总统,所以,无论哪里需要一个总统,都只能返回仅有的那个总统,而不能去新建一个。getPresident()方法会确定永远只创建一个总统。

类图与代码

 

渴望模式:

public class AmericaPresident {
 private static final AmericaPresident thePresident = new AmericaPresident();
 
 private AmericaPresident() {}
 
 public static AmericaPresident getPresident() {
 return thePresident;
 }
}

thePresident被定义成final类型,所以它永远都包含同一个对象引用。 

懒惰模式:

public class AmericaPresident {
 private static AmericaPresident thePresident;
 
 private AmericaPresident() {}
 
 public static AmericaPresident getPresident() {
 if (thePresident == null) {
 thePresident = new AmericaPresident();
 }
 return thePresident;
 }
}

单例模式在Java标准库中

java.lang.Runtime#getRuntime()方法是Java标准库中频繁使用的方法,getRunTime()方法返回一个与当前Java应用相关的Runtime对象。

class Runtime {
 private static Runtime currentRuntime = new Runtime();
 
 public static Runtime getRuntime() {
 return currentRuntime;
 }
 
 private Runtime() {}
 
 //... 
}

这一个使用getRuntime()的简单例子,它在Windows系统中读取一个网页。

Process p = Runtime.getRuntime().exec(
		"C:/windows/system32/ping.exe programcreek.com");
//get process input stream and put it to buffered reader
BufferedReader input = new BufferedReader(new InputStreamReader(
		p.getInputStream()));
 
String line;
while ((line = input.readLine()) != null) {
	System.out.println(line);
}
 
input.close();

输出:

Pinging programcreek.com [198.71.49.96] with 32 bytes of data:
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47
Reply from 198.71.49.96: bytes=32 time=52ms TTL=47
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47

Ping statistics for 198.71.49.96:
 Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
 Minimum = 52ms, Maximum = 53ms, Average = 52ms

另外一种单例模式的实现

私有的构造器在反射中没有保护实例化, Joshua Bloch (Effective Java) 提供了一种更好的实现方法。如果你还不熟悉枚举,这是有一个Oraclekh提供的好的例子

public enum AmericaPresident{
 INSTANCE;
 
 public static void doSomething(){
 //do something
 }
}

以上文章翻译自: http://www.programcreek.com/2011/07/java-design-pattern-singleton/

© 著作权归作者所有

共有 人打赏支持
下一篇: 结束
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
03/22
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
小菜学设计模式——设计模式总结之创建型

1、面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地...

learn_more
2015/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
2
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
4
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
8
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
7
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部