文档章节

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

奋斗到天明
 奋斗到天明
发布于 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
昌平
程序员
java设计模式-- 单例模式

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

爱学习的逃课君
2014/11/27
0
0
[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空
2015/06/03
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

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

勇敢写信
03/22
0
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HTTPS is easy

HTTPS is easy https://www.troyhunt.com/https-is-easy/ HTTPS is easy! In fact, it's so easy I decided to create 4 short videos around 5 minutes each to show people how to enable ......

openthings
17分钟前
0
0
bugList 2

用户端: 1. 上传文件时,当选择:彩色-A3-双面时,第二个图片有bug 应改为 和第一个图片的类型相同 2. 确认打印时,三个下拉选目前有bug 应改为:根据后台配置的商家,group by计算出不同城...

勇恒
20分钟前
2
0
keras cnn 网咯 mnist 分类

搭建貌似比tf是简单很多。。。。。 from keras.datasets import mnistfrom keras.utils import np_utilsfrom keras.models import Sequentialfrom keras.layers import Dense, Activat......

阿豪boy
23分钟前
0
0
解决 /var/run/nginx.pid failed

nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory) sudo nginx -c /etc/nginx/nginx.conf nginx -s reload...

驛路梨花醉美
24分钟前
0
0
nginx负载均衡-ssl原理-生成ssl密钥对-nginx配置ssl

nginx负载均衡: 1.创建配置文件 vim /usr/local/nginx/conf/vhost/load.conf #添加以下内容: upstream qq_com #名字自定义,借助此模块定义多个IP,后面...

ZHENG-JY
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部