Design Pattern 之 Singleton 模式

簡單的說,就是把global variable的概念延伸到Design Pattern裡,以方便做管理,也就是一個類別裡只存在一個實體,一旦被建立起來了,只能透過它才能存取該類別的成員或函式,就算在別處也建立此類別,也一樣是取到同一個實體,以下是簡單的範例:
#include "stdafx.h"
#include <iostream>

template<typename T>
class Singleton 
{
public:
 static T& Instance()
 {
  static T theSingleInstance;
  return theSingleInstance;
 }
};

class OnlyOne : public Singleton<onlyone> 
{
public:
 OnlyOne() { test = 10; }
 //OnlyOne(int _test) { test = _test; }
 void SetTest(int _test) { test = _test; }
 int GetTest() { return test; }

private:
 OnlyOne& operator= (const OnlyOne& lhs) {}
 OnlyOne(OnlyOne& rhs) {}
 friend class Singleton<onlyone>; 

 int test;
};


int _tmain(int argc, _TCHAR* argv[])
{
 OnlyOne* OTL = new OnlyOne;
 std::cout << OTL->Instance().GetTest() << std::endl;
 OnlyOne* XD = new OnlyOne; 
 XD->SetTest(100); // 嘗試去更改test的值
 std::cout << XD->Instance().GetTest() << std::endl;
 system("pause");
 return 0;
}
該範例未考慮到多執行緒的考量,沒去檢查是否已存在,對於程式的overhead挺大的,也不安全,當初GoF有解決的方式,但經證實是錯誤的,也有許多人提出相對應的解決方法,有興趣的去此部落格參考。

0 意見:

張貼留言