《修炼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); } }