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

   Java 设计模式-模板方法模式(Template Method)

   Java 设计模式-装饰器模式(Decorator)

   Java 设计模式-代理模式(Proxy Pattern)

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

   Java 设计模式-简单工厂(Simple Factory)

   Java 设计模式-工厂方法(Factory Method)

   Java 设计模式-原型模式(Prototype)

   Java 设计模式-适配器模式(Adapter)

   ​​​​​​Java 设计模式-桥接模式(Bridge)

  Java 设计模式-策略模式(Strategy Pattern)

  Java 设计模式-命令模式(Command Pattern)

  Java 设计模式-观察者(Observer )


   什么是单例模式?

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

      单例模式的意图

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

      单例模式的要点

  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);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈脩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值