单例模式

单例模式

一.为什么需要单例模式

•只允许存在唯一对象实例

•单例模式的商业应用
–网站计数器
–日志管理系统
–连接池、线程池、内存池

•获取对象实例的专门方法
–全局变量的定义不受控制,防君子不防小人
–专门方法是类型的一部分,我是类型我做主借助于类型禁止在外部创建对象仅在类型内部创建唯一对象实例提供用于获取对象实例公知接口

二.什么是单例模式

•禁止在类外部创建实例
–私有构造函数 private

•类自己维护其唯一实例
–静态成员变量 instance

•提供访问该实例的方法
–静态成员函数 getInstance()

三.如何实现单例模式

•饿汉式实现
–将单例类的唯一对象实例,实现为其静态成员变量
–优点:加载进程时静态创建单例对象,线程安全
–缺点:无论使用与否,总要创建

•懒汉式实现
–直到第一次使用时,才创建单例类的唯一对象实例
–优点:用则创建,不用不创建,什么时候用什么时候创建
–缺点:首次访问时动态创建单例对象,在多线程应用中,存在线程不安全的问题

    //饿汉模式
  3 class Singleton
  4 {
  5 public:
  6     static Singleton& getInstance (void)
  7     {
  8         return s_instance;
  9     }
 10 private:
 11     Singleton (void) {}
 12     Singleton (Singleton const& that) {}
 13     static Singleton s_instance;//这里static不能省,因为在类里不能声明相同类,同时如果定义全局变量和局部变量,都不是在同一个Singleton
 14                                 //类的作用域里。
 14 };
 15 Singleton Singleton::s_instance;
    //懒汉模式
  3 class Singleton
  4 {
  5 public:
  6     static Singleton& getInstance (void)
  7     {
  8         if (!s_instance)
  9         {
 10             pthread_mutex_lock (&m_mutex);
 11             if (!s_instance)
 12             {
 13                 s_instance = new Singleton;
 14             }
 15             pthread_mutex_unlock (&m_mutex);
 16         }
 17         return *s_instance;
 18     }
 19 private:
 20     Singleton (void) {}
 21     Singleton (Singleton const& that) {}
 22     static Singleton* s_instance;
 23     static pthread_mutex_t m_mutex;
 24 };
 25 Singleton* Singleton::s_instance = NULL;  
 26 pthread_mutex_t Singleton::m_mutex = PTHREAD_MUTEX_INITIALIZER;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值