全网整合营销服务商

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

免费咨询热线: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++单例设计模式详细讲解  # 多线程  # 多个  # 加锁  # 提供一个  # 是因为  # 最好的  # 在此  # 就不  # 一是  # 这段  # 我们可以  # 这也  # 给了  # 采用了  # 去做  # 如果没有  # 而出  # 它可以  # 时就  # 但它 


相关文章: 网站制作员失业,怎样查看自己网站的注册者?  兔展官网 在线制作,怎样制作微信请帖?  C#如何在一个XML文件中查找并替换文本内容  如何在阿里云高效完成企业建站全流程?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  Bpmn 2.0的XML文件怎么画流程图  网站专业制作公司有哪些,做一个公司网站要多少钱?  山东云建站价格为何差异显著?  ,石家庄四十八中学官网?  网站制作网站,深圳做网站哪家比较好?  ,网站推广常用方法?  如何彻底卸载建站之星软件?  建站之星安装失败:服务器环境不兼容?  高防服务器:AI智能防御DDoS攻击与数据安全保障  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  建站上市公司网站建设方案与SEO优化服务定制指南  海南网站制作公司有哪些,海口网是哪家的?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  ,网页ppt怎么弄成自己的ppt?  如何零基础在云服务器搭建WordPress站点?  香港服务器部署网站为何提示未备案?  如何快速查询域名建站关键信息?  宿州网站制作公司兴策,安徽省低保查询网站?  如何通过NAT技术实现内网高效建站?  如何快速搭建高效WAP手机网站吸引移动用户?  设计网站制作公司有哪些,制作网页教程?  青岛网站建设如何选择本地服务器?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  建站之星伪静态规则如何设置?  如何挑选高效建站主机与优质域名?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何通过VPS搭建网站快速盈利?  建站之星后台密码如何安全设置与找回?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何做网站制作流程,*游戏网站怎么搭建?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  建站主机与服务器功能差异如何区分?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  建站之星代理如何获取技术支持?  实现虚拟支付需哪些建站技术支撑?  高防服务器租用如何选择配置与防御等级?  如何在腾讯云服务器上快速搭建个人网站?  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何确保FTP站点访问权限与数据传输安全?  如何通过山东自助建站平台快速注册域名? 

您的项目需求

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