资讯专栏INFORMATION COLUMN

设计模式之单例模式

wing324 / 1052人阅读

摘要:单例模式可保证一个类只有一个实例,并提供一个类方法来访问该实例。构造函数的访问权限设置为,防止外部自己构造实例以上方法仅适用于单线程的情景下,因为在多线程情景下,会发生创建多个类实例的情况。

单例模式可保证一个类只有一个实例,并提供一个类方法来访问该实例。

class  SingletonDemo
{
    private static SingletonDemo singletonDemo;
    //构造函数的访问权限设置为private,防止外部自己构造实例
    private SingletonDemo(){}
    
    public static SingletonDemo getInstance(){
        if(singletonDemo == null){
            singletonDemo = new SingletonDemo();
        }
        return singletonDemo;
    }
}

以上方法仅适用于单线程的情景下,因为在多线程情景下,会发生创建多个类实例的情况。
如下图:

第一种:

class SingletonDemo1
{

   private static SingletonDemo1 singletonDemo1;

   private SingletonDemo1(){}
   //通过增加synchronized关键字来加锁
   public static synchronized SingletonDemo1 getInstance(){
       if(singletonDemo1 == null){
           singletonDemo1 = new SingletonDemo1();
       }
       return singletonDemo1;
   }

}

此方法的缺点:每次调用getInstance方法都要加锁,会造成很大的开销,是程序的效率大大降低,因此这不是最好的方法。

第二种:

class SingletonDemo2
{

   //急切创建实例,通过添加static关键字来使每次加载类的时候就创建实例
   private static SingletonDemo2 singletonDemo2 = new SingletonDemo2();

   private SingletonDemo2(){}
   
   public static SingletonDemo2 getInstance(){
       return singletonDemo2;
   }

}

第三种:

class SingletonDemo3
{

   //通过添加volatile关键字来保证实例的同步
   private volatile static SingletonDemo3 singletonDemo3;

   private SingletonDemo3(){}
   
   public static SingletonDemo3 getInstance(){
       if(singletonDemo3 == null){
           //这里二次加锁
           synchronized(SingletonDemo3.class){
               if(singletonDemo3 == null)
                   singletonDemo3 = new SingletonDemo3();
       }
       return singletonDemo3;
   }

}

注意:这种方法只能应用于jdk1.5及以后的版本,之前的版本是不适用的,因为之前的版本中jvm对于volatile关键字的实现会是双重加锁的失效。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71249.html

相关文章

  • 大话PHP设计模式单例模式升级版

    摘要:用来指向已创建好的实例构造函数为空注意这里是关键这是我们需要调用的方法把函数也定义为空,这样就大功告成啦。 接上一篇大话PHP设计模式之单例模式 这一篇介绍一下升级版的单例模式,废话不说先上代码 不完美的单例模式 class singleMode { //用来指向已创建好的实例 public static $instance; //判断是...

    darcrand 评论0 收藏0
  • 每天一个设计模式单例模式

    摘要:博主按每天一个设计模式旨在初步领会设计模式的精髓,目前采用靠这吃饭和纯粹喜欢两种语言实现。单例模式用途如果一个类负责连接数据库的线程池日志记录逻辑等等,此时需要单例模式来保证对象不被重复创建,以达到降低开销的目的。 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)两种语言实现。诚然,每种设计模式都有多种实...

    yy736044583 评论0 收藏0
  • 每天一个设计模式单例模式

    摘要:博主按每天一个设计模式旨在初步领会设计模式的精髓,目前采用靠这吃饭和纯粹喜欢两种语言实现。单例模式用途如果一个类负责连接数据库的线程池日志记录逻辑等等,此时需要单例模式来保证对象不被重复创建,以达到降低开销的目的。 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)两种语言实现。诚然,每种设计模式都有多种实...

    lijy91 评论0 收藏0
  • 大话PHP设计模式单例模式

    摘要:上面是简单的单例模式,自己写程序的话够用了,如果想继续延伸,请传送至大话设计模式之单例模式升级版 看了那么多单例的介绍,都是上来就说怎么做,也没见说为什么这么做的。那小的就来说说为什么会有单例这个模式以便更好的帮助初学者真正的理解这个设计模式,如果你是大神,也不妨看完指正一下O(∩_∩)O首先我不得不吐槽一下这个模式名字单例,初学者通过字面很难理解什么是单例,我觉得应该叫唯一模式更贴切...

    VEIGHTZ 评论0 收藏0
  • 优才公开课笔记:php设计模式(一) 单例模式

    摘要:最近开展了三次设计模式的公开课,现在来总结一下设计模式在中的应用,这是第一篇创建型模式之单例模式。不过因为不支持多线程所以不需要考虑这个问题了。 最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第一篇创建型模式之单例模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。 设计模式不...

    guyan0319 评论0 收藏0
  • JavaScript设计模式单例模式

    摘要:原文博客地址单例模式系统中被唯一使用,一个类只有一个实例。中的单例模式利用闭包实现了私有变量两者是否相等弱类型,没有私有方法,使用者还是可以直接一个,也会有方法分割线不是单例最简单的单例模式,就是对象。 原文博客地址:https://finget.github.io/2018/11/06/single/ 单例模式 系统中被唯一使用,一个类只有一个实例。实现方法一般是先判断实例是否存在,...

    lk20150415 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<