单例模式
一.为什么需要单例模式
•只允许存在唯一对象实例
•单例模式的商业应用
–网站计数器
–日志管理系统
–连接池、线程池、内存池
•获取对象实例的专门方法
–全局变量的定义不受控制,防君子不防小人
–专门方法是类型的一部分,我是类型我做主借助于类型禁止在外部创建对象仅在类型内部创建唯一对象实例提供用于获取对象实例公知接口
二.什么是单例模式
•禁止在类外部创建实例
–私有构造函数 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;