[译]Java 设计模式之单例
(文章翻译自Java Design Pattern: Singleton)
单例是在Java最经常被用到的设计模式。它通过阻止其他的实例化和修改来用于控制创建对象的数目。这一特性可应用于那些当只有一个对象存在时能够更加有效的系统,或者是限制对象的实例化数目,比如:
1.私有化构造器(private constructor -)-没有其他的类可以实现化一个新的对象
2.私有化引用(private reference -)-没有其他的修改
3.公共的静态方法(public static method):仅有的获取一个对象的途径
单例的举例
这是一个简单的应用场景。一个国家只会有一个总统。所以任何时候一个总统总是被需要的,唯一的总统应该是返回而不是创建一个新的。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()简单的简单例子,它在一个window系统中读取一个网页。
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) 提供了一个关于单例的更好的实现,如果你Mnum 不太熟悉的话,下面就是一个来自于Oracle的不错的例子。
public enum AmericaPresident{
	INSTANCE;
	public static void doSomething(){
		//do something
	}
}
												
											[译]Java 设计模式之单例的更多相关文章
- Java设计模式之单例
		
一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...
 - java设计模式之单例设计模式
		
单例设计模式 保证一个类在使用过程中,只有一个实例.优势就是他的作用,这个类永远只有一个实例. 优势:这个类永远只有一个实例,占用内存少,有利于Java垃圾回收. 单例设计模式关键点 私有的构造方法. ...
 - Java设计模式之 — 单例(Singleton)
		
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8860649 写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上 ...
 - java设计模式_单例
		
public class Singleton { public static void main(String[] args) throws Exception { System.out.printl ...
 - JAVA设计模式:单例设计
		
1.单例设计Singleton的引出 单例设计,从名字上首先可以看出单---即只有一个,例---只的是实例化对象:那么单例也就是说一个类,只产生了一个实例化对象.但是我们都知道,一个类要产生实例化对象 ...
 - java设计模式之单例设计模式和多例设计模式
		
单例设计模式:构造方法私有化,在类的内部定义static属性和方法,利用static方法来取得本类的实例化对象:无论外部产生多少个实例化对象,本质上只有一个实例化对象 饿汉式单例设计 class Si ...
 - Java设计模式之单例设计模式  入门实例
		
一.基础概念 (1).单例设计模式:保证一个类在内存中的对象唯一性. (2).应用场景:数据都存储在配置文件的对象中,多个程序对同一个配置文件的对象进行操作.一个程序要基于另一个程序操作后的结果进行操 ...
 - Java设计模式之单例设计模式总结
		
package singleton; /**单例设计模式 饿汉式 * * @author gx *这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化, ...
 - java设计模式--解决单例设计模式中懒汉式线程安全问题
		
首先写个单例,懒汉模式: public class SingleDemo { private static SingleDemo s = null; private SingleDemo(){} pu ...
 
随机推荐
- ASP.NET开发规范:OWIN
			
ASP.NET开发规范:OWIN 今天投简历 准备面试了... 本节目录: OWIN简介 OWIN规范 Katana Hello World(3种Host) 自定义Middleware OWIN简介 ...
 - Python脚本传參和Python中调用mysqldump
			
Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ...
 - 每天收获一点点------Hadoop RPC机制的使用
			
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
 - POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)
			
职务地址:id=2762">POJ 2762 先缩小点.进而推断网络拓扑结构是否每个号码1(排序我是想不出来这点的. .. ).由于假如有一层为2的话,那么从此之后这两个岔路的点就不可 ...
 - Android重力加速度传感器数据去噪
			
public void onSensorChanged(SensorEvent event) { final float alpha = 0.8; gravity[0] = alpha * gravi ...
 - Topshelf创建Windows服务
			
使用Topshelf创建Windows服务 概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps ...
 - ubunut 查看port被哪个程序占用
			
查看8087port被哪个程序占用 lsof -i :8087 -n
 - 学习日记之单例模式和Effective C++
			
单例模式(Singleton):保证一个类仅有一个实例,并提供一个訪问它的全局訪问点. (1),通常我们能够让一个全局变量使得一个对象被訪问,但它不能防止你实例化多个对象.一个最好的办法就是,让类自身 ...
 - ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
			
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
 - 第19章 解释器模式(Interpreter Pattern)
			
原文 第19章 解释器模式(Interpreter Pattern) 解释器模式 导读:解释器模式,平常用的比较的少,所以在写这个模式之前在博客园搜索了一番,看完之后那叫一个头大.篇幅很长,我鼓足了劲 ...