Singleton Pattern

屬於 Creational pattern。

確保 class 只有一個 instance,並且給它 global 的存取點。

可以做到延後產生 instance,也就是真正使用到時才 create instance。如果用 global variable,依據不同語言及實作的特性可能在程式一開始就產生 instance。

常用來管理 shared resource。

做法

  • 將 constructor、copy constructor、destructor、assignment operator 宣告為 private 確保外面無法產生第二個 instance 及 destory instance。
  • 使用 static function 讓外界取得唯一的 instance。

C++ 實作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Singleton
{
public:
static Singleton* GetSingleton();

private:
Singleton() { /* implement */ };
~Singleton();
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
};

Singleton* Singleton::GetSingleton()
{
static Singleton* pSingleton = new Singleton();
return pSingleton;
}

外面要取得 instance 時 call Singleton::GetSingleton()。這邊直接用 C++ 的 static local variable 在 function 第一次 call 時會 initialize 之後不會再 initialize 的特性,而它的 lifetime 會持續到程式結束。

有另一種做法是 GetSingleton() 不 return pointer,而 return reference。

這個實作沒有 thread-safe,有多個 thread 會 call GetSingleton() 就 GG 了。要 thread-safe 可以用 double-checked locking。

Ref