Singleton


  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Singleton {
  5. public:
  6. static Singleton* GetInstance() {
  7. // スタック上で static なインスタンスを作れば、
  8. // NULL チェックする必要がないので、
  9. // スレッドセーフな Singleton になる
  10. static Singleton instance;
  11. return &instance;
  12. }
  13. void Operation() {
  14. cout << "addr: " << this << endl;
  15. cout << "m_num: " << m_num << endl;
  16. }
  17. void Set(int num) {
  18. m_num = num;
  19. }
  20. private:
  21. // 生成、コピーの禁止
  22. Singleton() : m_num(0) {}
  23. Singleton(const Singleton& r) {}
  24. Singleton& operator=(const Singleton& r) {}
  25. int m_num;
  26. };
  27.  
  28.  
  29. int main() {
  30. Singleton *obj1 = Singleton::GetInstance();
  31. Singleton *obj2 = Singleton::GetInstance();
  32. obj1->Operation();
  33. obj1->Set(1);
  34. obj2->Operation();
  35. return 0;
  36. }
  37.  

出力
addr: 0x402018
m_num: 0
addr: 0x402018
m_num: 1


複数のインスタンスを管理する
  1. static Singleton* GetInstance(int id) {
  2. static map<int, Singleton*> instances;
  3. map<int, Singleton*>::iterator it = instances.find(id);
  4. if (it == instances.end()) {
  5. instances[id] = new Singleton;
  6. return instances[id];
  7. } else {
  8. return it->second;
  9. }
  10. }
  11.  


参考サイト

デザインパターンを“喩え話”で分かり易く理解する
http://www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html



デザインパターンの骸骨たち
http://www002.upp.so-net.ne.jp/ys_oota/mdp/

デザインパターンの使い方: Singleton
http://japan.internet.com/developer/20080826/26.html
最終更新:2012年01月27日 00:39