Java 设计模式-单例模式(Singleton)

      什么是单例模式?

      单例模式就是某个类只有唯一一个实例。

      单例模式的意图

        单例模式的意图是为了确保一个类有且仅有一个实例,并且为它提供一个全局的访问点

      单例模式的要点

  1.   一个类只有一个实例
  2. 类必须自行创建这个实例
  3. 类自行向系统提供实例

       常见的单例实现方式

  • 饿汉模式
饿汉模式在类中声明一个实例并初始化

 

/**
 * 饿汉单例模式
 * @author zhanfgwei
 * @version $Id: HungrySingleton.java, v 0.1 2014年9月20日 下午10:17:11 Lenovo Exp $
 */
public class EagerSingleton {

    /***初始化一个实例**/
    private static final EagerSingleton instance = new EagerSingleton();

    /**
     * 私有化的构造方法
     */
    private EagerSingleton() {
        super();
    }

    /**
     * 静态工厂方法获取实例
     *
     * @return
     */
    public static EagerSingleton getInstance() {
        return instance;
    }

}

 

  •  懒汉模式-线程安全
懒汉模式,是延迟初始化但是如果工厂方法不同步会导致产生多实例
/**
 *
 * @author zhangwei
 * @version $Id: SafeLazySingleton.java, v 0.1 2014年9月20日 下午10:25:04 Lenovo Exp $
 */
public class SafeLazySingleton {

    /**
     * 实例属性
     */
    private static SafeLazySingleton instance = null;

    /**
     * 私有化构造方法
     */
    private SafeLazySingleton() {

    }

    /**
     *同步的静态工厂方法
     *
     * @return
     */
    synchronized public static SafeLazySingleton getInstance() {
        if (instance == null) {
            instance = new SafeLazySingleton();
        }
        return instance;
    }

}
  •  内部类方式
内部类方法是对懒汉模式的优化,结合了饿汉模式和懒汉模式的有点,有效地解决了延迟初始化和线程安全问题。

 

/**
 *
 * @author zhangwei
 * @version $Id: InnerSingleton.java, v 0.1 2014年9月20日 下午11:11:26 Lenovo Exp $
 */
public class InnerSingleton {

    /**
     * 私有化的构造方法
     */
    private InnerSingleton() {

    }

    /**
     * 静态内部类,持有实例
     *
     * @author zhangwei
     * @version $Id: InnerSingleton.java, v 0.1 2014年9月20日 下午11:22:35 Lenovo Exp $
     */
    private static class InstanceHolder {

        static InnerSingleton instance = new InnerSingleton();
    }

    /**
     * 静态工厂方法,
     *
     * @return
     */
    public static InnerSingleton getInstance() {
        return InstanceHolder.instance;
    }

}

 

  •  登记式
/**
 *
 * @author zhangwei
 * @version $Id: RegisterSingletone.java, v 0.1 2014年9月20日 下午10:27:12 Lenovo Exp $
 */
public class RegisterSingleton {

    private static Map<String, RegisterSingleton> registers = new ConcurrentHashMap<String, RegisterSingleton>();

    static {
        registers.put(RegisterSingleton.class.getName(), new RegisterSingleton());
    }

    private RegisterSingleton() {

    }

    public static RegisterSingleton getInstance(String name) {
        if (name == null) {
            name = RegisterSingleton.class.getName();
        }
        if (registers.get(name) == null) {
            try {
                registers.put(name, (RegisterSingleton) Class.forName(name).newInstance());
            } catch (Exception e) {
                LoggerUtils.error("异常");
            }
        }
        return registers.get(name);
    }

}

 

你可能感兴趣的:(Java 设计模式-单例模式(Singleton))