`
wuhaidong
  • 浏览: 349794 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

单例模式

    博客分类:
  • SE
阅读更多

单例模式是一种常见的设计模式

 

单例模式分三种:懒汉式单例,饿汉式单例,登记式单例三种。

 

单例模式有一下特点:

单例类只能有一个实例

单例类必须自己创建自己的唯一实例

单例类必须给所有其他对象提供这一实例

 

package org.cric.sing;
/**
 * 
 * 懒汉式单例在类加载的时候不创建单例实例.
 * 只有在第一次请求实例的时候创建,并且只在第一次创建后,以后不再创建该类的实例
 */
public class EagerSingleton {
	//私有的(private)唯一(static final)实例成员,在类加载的时候就创建好了单例对象
	private static final EagerSingleton m_instance = new EagerSingleton();
	//私有构造方法,避免外部创建实例
	private EagerSingleton(){};
	//静态工厂方法,返回此类的唯一实例
	public static EagerSingleton getInstance(){
		return m_instance;
	}
}

 

 

package org.cric.sing;
/**
 * 饿汉式单例在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。
 *
 */
public class LazySingleton {
	//私有静态对象,加载时候不做初始化
	private static LazySingleton m_intance = null;
	//私有构造方法,避免外部创建实例
	private LazySingleton(){};
	//静态工厂方法,返回此类的唯一实例.当发现实例没有初始化的时候,才初始化
	synchronized public static LazySingleton getInstance(){
		if(m_intance == null){
			System.out.println("创建");
			m_intance = new LazySingleton();
		}
		return m_intance;
	}
}

 

 

package org.cric.sing;

import java.util.HashMap;
import java.util.Map;

/**
 *  登记式单例这个单例实际上维护的是一组单例类的实例,将这些实例存放在一个Map(登记薄)中
 *  对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回。
 */
public class RegSingleton {
	
	//登记薄,用来存放所有登记的实例
	private static Map<String,RegSingleton> m_registry = new HashMap();
	//在类加载时候添加一个实例到登记薄
	static{
		RegSingleton x = new RegSingleton();
		m_registry.put(x.getClass().getName(),x);
	}
	//受保护的默认构造方法
	protected RegSingleton(){};
	//静态工厂方法,返回指定登记对象的唯一实例;
	//对于己登记的直接取出返回,对于还未登记,然后取出返回
	public static RegSingleton getInstance(String name){
		if(null != name){
			name = "RegSingleton";
		}
		if(m_registry.get(name) == null){
			try {
				m_registry.put(name, (RegSingleton)Class.forName(name).newInstance());
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return m_registry.get(name);
	}
}

 
分享到:
评论
2 楼 闪闪4521 2011-06-15  
貌似懒汉和恶汉模式写反了吧??
1 楼 hj_Sunflower 2010-11-13  
我只用过一种,其中的原理当一点点 。  嘿嘿  学习了 。

相关推荐

Global site tag (gtag.js) - Google Analytics