`
xmong
  • 浏览: 259064 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

单例模式

阅读更多
单例模式


目录
1 单例模式 1
1.1 单例模式的要点 1
1.2 单例模式的使用场景 1
1.3 单例模式的实现 1
1.3.1 饿汉式单例 1
1.3.2 懒汉式单列 2
1.3.3 单列模式的优缺点 2
1.3.4 登记式单列 2
1.4 单例模式应用---属性管理器 3
1.5 多例模式 3



1 单例模式
1.1 单例模式的要点
(1) 单例类只能有一个实例。
(2) 单例类必须自己创建自己的唯一的实例。
(3) 单例类必须给其他对象提供这一实例。

1.2 单例模式的使用场景
单例模式使用的必要条件就是一类只能有一个实例的场景,如系统的资源管理,回收站,打印机,数据库连接等。

1.3 单例模式的实现

1.3.1 饿汉式单例
public class SingletonEage {

	/**
	 * static变量在类装载的时候就会进行初始化,且只初始化一次,整个类共享这个变量实例。
	* final变量一旦初始化后就不能被改变。
	* instance来存储单例实例。
	 */
	private static final SingletonEage instance = new SingletonEage();
	
	/**
	 * 私有的构造方法,使得外部类不能创建该类的实例,可以在内部控制创建实例的数目 
	 */
	private SingletonEage(){}
	
	/**
	 * 提供外部类获取实例的方法,构造方法私有化,外部类不能构造该类的实例。
	* static方法,可以通过类调用该方法返回该类的实例。
	 */
	public static SingletonEage getInstance(){
		return instance;
		}
}


1.3.2 懒汉式单列
public class SingletonLaze {

	/**
	* private变量,定义一个私有变量来存储创建的实例
	* static变量在类装载的时候就会进行初始化,整个类共享这个变量实例。
	 */
	private static SingletonLaze instance = null;

	/**
	* 私有的构造方法,使得外部类不能创建该类的实例,可以在内部控制创建实例的数目
	 */
	private SingletonLaze(){}
	
	/**
	 * synchronized 锁定该类的同步锁,实现线程安全
	* static方法,可以通过类调用该方法返回该类的实例。
	 */
	synchronized public static SingletonLaze getInstance(){
		//判断实例是否为null,为null则创建该类的实例。
		if(instance == null){
			instance = new SingletonLaze();
		}
		return instance;
	}
	
}


1.3.3 单列模式的优缺点
饿汉式实现单例是以空间换时间,当饿汉式单例类在类装载的时候就会被创建类实例,不管你用不用先创建出来,然后每次要使用实例的时候在获取实例,不用像赖汉式那样使用的时候去判断实例是否存在,从而节约了时间。
懒汉式实现单例是以时间换空间,懒汉式不想饿汉式那样在类加载的时候创建类实例,而是等待要使用实例的时候在去判断实例是否存在,如果不存在则创建类实例,特别是使用同步锁方法,这样会降低方法的访问速度,使得每次使用实例都需要同步去判断类实例是否存在,这样,会花费很多时间。
双重检查加锁:可以使用双重检查加锁来提高懒汉式的性能。并不是每次调用获取类实例方法都需要同步,可以先不同步方法,进入方法后,先检查类实例是否存在,如果不存在才进入同步块,创建类实例,第一次检查的时候需要进入同步块,当再次进入获取类实例方法后,再次检查类实例是否存在,此时类实例已经存在则不需要在进入同步块。这样一来只需要同步一次,从而减少了多次同步浪费的时间。
/**
	* static方法,可以通过类调用该方法返回该类的实例。
	 */
	public static SingletonLaze getInstance(){
		//判断实例是否为null,为null则创建该类的实例。
		if(instance == null){
			//同步块,保证线程安全
			synchronized (this) {
				if(null == instance)
				instance = new SingletonLaze();
			}
			return instance;
	}
}


1.3.4 登记式单列
登记式单列利用Map缓存的思想来实现单列,在类加载的时候创建好一个类实例缓存到map中,同过该map可以获取该类实例。

package com.singleton;

import java.util.HashMap;

/**
 * @author xmong
 *
 */
public class SingletonReg {

	
	private static HashMap instanceMap = new HashMap();
	
	static{
		SingletonReg instance = new SingletonReg();
		instanceMap.put(instance.getClass().getName(), instance);
	}
	
	protected SingletonReg(){}

	
	public static SingletonReg getInstance(String name){
		if(name==null){
			name="com.singleton.SingletonReg";
		}
		if(instanceMap.get(name)==null){
			try {
				instanceMap.put(name, Class.forName(name).newInstance());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return (SingletonReg)instanceMap.get(name);
	}
		
}


1.4 单例模式应用---属性管理器

1.5 多例模式


---------------------------------------------------

参考:
《java与模式》
《研磨设计》

未完待续

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics