单列模式的实现主要有两种:饿汉式单例类和懒汉式单例类 1)饿汉式单例类 代码清单1:饿汉式单例类 public class EagerSingleton{ private static final EagerSingleton m_instance = new EagerSingleton(); /*** 私有的默认构造子*/ private EagerSingleton() { } /*** 静态工厂方法*/ public static EagerSingleton getInstance(){ return m_instance; } } 读者可以看出,在这个类被加载时,静态变量m_instance 会被初始化,此时类的私有 构造子会被调用。这时候,单例类的惟一实例就被创建出来了。 Java 语言中单例类的一个最重要的特点是类的构造子是私有的,从而避免外界利用构 造子直接创建出任意多的实例。值得指出的是,由于构造子是私有的,因此,此类不能被 继承。 2)懒汉式单例类。与饿汉式单例类相同之处是,类的构造子是私有的。与饿汉式单例类不同的是,懒汉 式单例类在第一次被引用时将自己实例化。如果加载器是静态的,那么在懒汉式单例类被 加载时不会将自己实例化 代码清单2:懒汉式单例类 package com.javapatterns.singleton.demos; 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; } } 读者可能会注意到,在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化, 以处理多线程环境。有些设计师在这里建议使用所谓的“双重检查成例”。必须指出的是, “双重检查成例”不可以在Java 语言中使用。
|