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

发布时间 - 2026-01-10 21:53:07    点击率:

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


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何快速搭建虚拟主机网站?新手必看指南  手机网站制作与建设方案,手机网站如何建设?  Android实现代码画虚线边框背景效果  如何快速重置建站主机并恢复默认配置?  网站页面设计需要考虑到这些问题  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何选择PHP开源工具快速搭建网站?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何在阿里云香港服务器快速搭建网站?  中山网站推广排名,中山信息港登录入口?  如何快速搭建自助建站会员专属系统?  如何注册花生壳免费域名并搭建个人网站?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  JS经典正则表达式笔试题汇总  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  昵图网官网入口 昵图网素材平台官方入口  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel如何为API生成Swagger或OpenAPI文档  浅谈redis在项目中的应用  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  高端建站三要素:定制模板、企业官网与响应式设计优化  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  制作旅游网站html,怎样注册旅游网站?  如何在万网利用已有域名快速建站?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  香港服务器租用费用高吗?如何避免常见误区?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  在Oracle关闭情况下如何修改spfile的参数  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  如何快速搭建个人网站并优化SEO?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案