全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++和java设计模式之单例模式

单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。其构造过程由自身完成,可以将构造方法定义为private型的,这样外界就只能通过定义的静态的函数Instance()构造实例,这个函数的目的就是返回一个类的实例,在此方法中去做是否有实例化的判断。客户端不再考虑是否需要去实例化的问题,把这些都交给了单例类自身。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法,就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

C++版本:

  template <class T>
  class Singleton
  {
  public:
    static inline T* Instance();
    static inline void ReleaseInstance();

  private:
    Singleton(void){}
    ~Singleton(void){}
    Singleton(const Singleton&){}
    Singleton & operator= (const Singleton &){}

    static std::auto_ptr<T> m_instance;
    static ThreadSection m_critSection;
  };

  template <class T>
  std::auto_ptr<T> Singleton<T>::m_instance;

  template <class T> 
  ThreadSection Singleton<T>::m_critSection;

  template <class T>
  inline T* Singleton<T>::Instance()
  {
    AutoThreadSection aSection(&m_critSection);
    if( NULL == m_instance.get())
    {
      m_instance.reset ( new T);
    }

    return m_instance.get();
  }
  template<class T>
  inline void Singleton<T>::ReleaseInstance()
  {
    AutoThreadSection aSection(&m_critSection);
    m_instance.reset();
  }

#define DECLARE_SINGLETON_CLASS( type ) \
  friend class std::auto_ptr< type >;\
    friend class Singleton< type >;

   多线程时Instance()方法加锁保护,防止多线程同时进入创建多个实例。m_instance为auto_ptr指针类型,有get和reset方法。发现好多网上的程序没有对多线程进行处理,笔者觉得这样问题很大,因为如果不对多线程处理,那么多线程使用时就可能会生成多个实例,违背了单例模式存在的意义。加锁保护就意味着这段程序在绝大部分情况下,运行是没有问题的,这也就是笔者对自己写程序的要求,即如果提前预料到程序可能会因为某个地方没处理好而出问题,那么立即解决它;如果程序还是出问题了,那么一定是因为某个地方超出了我们的认知。

  再附一下Java版的单例模式:

public class Singleton {
  private Singleton() {    
  }
  
  private static Singleton single = null;
  
  public static Singleton getInstance() {
    if (single == null) {
      synchronized (Singleton.class) {
        if (single == null) {
          single = new Singleton();
        }        
      }
    }
    
    return single;
  }
}

   上述代码中,一是对多线程做了处理,二是采用了双重加锁机制。由于synchronized每次都会获取锁,如果没有最外层的if (single == null)的判断,那么每次getInstance都必须获取锁,这样会导致性能下降,有了此判断,当生成实例后,就不会再获取锁。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# C++  # java  # 单例模式  # C++简明图解分析静态成员与单例设计模式  # C++设计模式之单例模式详解  # 使用设计模式中的单例模式来实现C++的boost库  # C++设计模式之单例模式  # C++单例设计模式详细讲解  # 多线程  # 多个  # 加锁  # 提供一个  # 是因为  # 最好的  # 在此  # 就不  # 一是  # 这段  # 我们可以  # 这也  # 给了  # 采用了  # 去做  # 如果没有  # 而出  # 它可以  # 时就  # 但它 


相关文章: 专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何有效防御Web建站篡改攻击?  网站app免费制作软件,能免费看各大网站视频的手机app?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何在景安服务器上快速搭建个人网站?  如何通过多用户协作模板快速搭建高效企业网站?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  建站之星安装路径如何正确选择及配置?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  广东企业建站网站优化与SEO营销核心策略指南  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  c# await 一个已经完成的Task会发生什么  简历在线制作网站免费,免费下载个人简历的网站是哪些?  *服务器网站为何频现安全漏洞?  网站制作公司排行榜,四大门户网站排名?  制作表格网站有哪些,线上表格怎么弄?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  如何快速搭建高效香港服务器网站?  表情包在线制作网站免费,表情包怎么弄?  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何通过远程VPS快速搭建个人网站?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  C#如何序列化对象为XML XmlSerializer用法  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  如何快速重置建站主机并恢复默认配置?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  建站之星3.0如何解决常见操作问题?  济南网站制作的价格,历城一职专官方网站?  如何用y主机助手快速搭建网站?  深圳网站制作培训,深圳哪些招聘网站比较好?  如何在IIS中新建站点并配置端口与物理路径?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  C#如何使用XPathNavigator高效查询XML  如何高效完成独享虚拟主机建站?  制作网站的软件免费下载,免费制作app哪个平台好?  网站制作壁纸教程视频,电脑壁纸网站?  制作网站的模板软件,网站怎么建设?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何选择网络建站服务器?高效建站必看指南  如何在Windows服务器上快速搭建网站?  建站之星Pro快速搭建教程:模板选择与功能配置指南  如何高效配置香港服务器实现快速建站?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何选择可靠的免备案建站服务器?  已有域名如何免费搭建网站?  北京网站制作网页,网站升级改版需要多久? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。