单例模式的实现代码:懒汉式、饿汉式、登记式

《修炼Java开发技术:在架构中体验设计模式和算法之美》


懒汉式的实现代码:

public class LazySingleton {
	//私有静态对象,加载时候不做初始化
	private static LazySingleton m_instance = null;
	//私有构造方法,避免外部创建实例
	private LazySingleton(){}
	//静态工厂方法,返回此类的唯一实例。当发现实例没有初始化的时候,才初始化。
	synchronized public static LazySingleton getInstance(){
		if (m_instance==null) {
			m_instance = new LazySingleton();
		}
		return m_instance;
	}
}

饿汉式的实现代码:

public class HungerSingleton {
	//私有的唯一(static final)实例成员,在类加载的时候就创建好了单例对象
	private static final HungerSingleton m_instance=new HungerSingleton();
	//私有构造方法,避免外部创建实例
	private HungerSingleton(){}
	//静态工厂方法,返回此类的唯一实例
	public static HungerSingleton getInstance(){
		return m_instance;
	}
}

登记式的实现代码:

public class RegSingleton {
	// 登记簿,用来存放所有登记的实例
	private static Map<String, RegSingleton> m_registry = new HashMap<String, RegSingleton>();
	// 在类加载的时候添加一个实例到登记簿
	static {
		RegSingleton x = new RegSingleton();
		m_registry.put(x.getClass().getName(), x);
	}

	// 受保护的默认构造方法
	protected RegSingleton() {
	}

	// 静态工厂方法,返回指定登记对象的唯一实例;对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
	public RegSingleton getInstance(String name) {
		if (name == null) {
			name = "RegSingleton";
		}
		if (m_registry.get(name) == null) {
			try {
				m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return m_registry.get(name);
	}
}

如果既要饿汉式效率,又要懒汉式延迟加载,可以用下面的演示代码来实现:

import java.util.HashMap;
import java.util.Map;
public class RegSingleton {
	// 登记簿,用来存放所有登记的实例
	private static Map<String, RegSingleton> m_registry = new HashMap<String, RegSingleton>();
	// 在类加载的时候添加一个实例到登记簿
	static {
		RegSingleton x = new RegSingleton();
		m_registry.put(x.getClass().getName(), x);
	}

	// 受保护的默认构造方法
	protected RegSingleton() {
	}

	// 静态工厂方法,返回指定登记对象的唯一实例;对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
	public RegSingleton getInstance(String name) {
		if (name == null) {
			name = "RegSingleton";
		}
		if (m_registry.get(name) == null) {
			try {
				m_registry.put(name, (RegSingleton) Class.forName(name).newInstance());
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return m_registry.get(name);
	}
}


你可能感兴趣的:(java,设计模式,单例模式)