单例模式(Singleton Pattern)

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

单例模式结构

      单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供全局访问接口。单例模式是结构最简单的设计模式一,在它的核心结构中只包含一个被称为单例类的特殊类。单例模式结构如下图所示:


      单例模式结构图中只包含一个单例类角色:

      ● Singleton(单例类):在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。


单例模式实现

解决方案一 单例模式的经典实现

      单例类中的getInstance()方法是静态的,这意味着它是一个类方法,所以可以在代码的任何地方使用Singleton.getInstance()访问它,这和访问全局变量一样简单,只是多了个优点:单例可以延迟实例化。其关键代码如下所示;

public class Singleton {
    // 利用一个静态变量来记录Singleton的唯一实例。
    private static Singleton uniqueInstance;
 
    // 把构造器声明为私有的,只有Singleton类内才可以调用构造器。
    private Singleton() {
    }
 
    // 用getInstance()方法实例化对象,并返回这个实例。
    public static Singleton getInstance() {
        // 如果uniqueInstance是空的,表示还没有创建实例。
        if (uniqueInstance == null) {
            // 如果uniqueInstance为空,我们就利用私有构造器产生一个Singleton实例并把它赋值给uniqueInstance静态变量中
            // 请注意,如果我们不需要这个实例,它就永远不会产生,这就是“延迟实例化”。
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

       在实际应用中,如果涉及到多线程问题的处理时,解决方案一则会出现非常严重的问题。现在我们对解决方案一的代码进行详细分析,当第一次调用getInstance()方法创建单例类的实例时,uniqueInstance对象为null值,因此系统将执行代码uniqueInstance= new Singleton(),在此过程中,由于要对单例类Singleton进行大量初始化工作,需要一段时间来创建Singleton对象。而在此时,如果再一次调用getInstance()方法(通常发生在多线程环境中),由于uniqueInstance可能还未创建成功,仍为null值,判断条件(uniqueInstance== null)为真值,因此代码uniqueInstance= new Singleton()将再次执行,导致创建了多个uniqueI

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值