c++ 创建型模式-单例模式(Singleton)
1) 意图:
保证一个类仅有一个实例,并且提供一个访问它的全局访问点
2) 结构:
其中:
Singleton提供一个instance操作,这是其他客户访问该类的唯一实例。
保证唯一实例有以下操作:
- 构造函数和析构函数不对外开放
- 声明一个对外公开的静态函数作为访问该类的唯一接口
- 单例函数中声明一个静态的类指针,且做好锁保护
3) 适用性:
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
- 当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时
4) 举例:
这里举例分两个,一个单例,一个多例,多例就是一个类可以根据参数不同构建不同的实例,但这些个实例也是唯一的。
- 单例
1 class Singleton 2 { 3 private: 4 Singleton() {} 5 virtual ~Singleton() {} 6 public: 7 static Singleton* instance() 8 { 9 static Singleton* Instance; 10 if (Instance == NULL) 11 { 12 static CMutex Mutex; 13 Mutex.Lock(); 14 if (Instance == NULL) 15 { 16 Instance = new Singleton(); 17 } 18 Mutex.Unlock(); 19 } 20 return Instance; 21 } 22 };
2. 多例
1 std::map<int, Singleton*> Singleton::s_map; 2 class Singleton 3 { 4 private: 5 Singleton(int num):m_num(num) {} 6 virtual ~Singleton() {} 7 public: 8 static Singleton* instance(int num) 9 { 10 for (std::map<int, Singleton*>::iterator it = s_map.begin(); 11 it != s_map.end(); ++it) 12 { 13 if (it->first == num) 14 { 15 return it->second; 16 } 17 } 18 static CMutex Mutex; 19 Mutex.Lock(); 20 Singleton* Instance = new Singleton(num); 21 s_map.insert(std::map<int, Singleton*>::value_type(num, Instance)); 22 Mutex.Unlock(); 23 return Instance; 24 } 25 private: 26 static std::map<int, Singleton*> s_map; 27 int m_num; 28 };