singleton pattern
意圖: 保證一個類僅有一個執行個體,并提供一個通路它的全局通路點。
現實中的問題:
汽車制造為例,很多不同的汽車型号使用相同的子構件,包括基本部件(車燈,雨刮,輪胎等)這些通用的功能,部件。
效果:
使用某種方法來控制如何建立類執行個體,然後確定在任何給定的時間隻建立一個類執行個體。 這會确切地給我們提供所需的行為,
并使用戶端不必了解任何類細節。
GOF原型
C++實作:
class Singleton
{
private:
Singleton(){} //這裡需要特别注意,其他的構造函數
Singleton(const Singleton & sg){} //拷貝構造
Singleton operator=(const Singleton & sg){}
~Singleton(){}
public:
static Singleton* Instance()
{
//檢查成員變量是否已初始化,如果沒有的話,則建立一個新執行個體。
if(pSelf == NULL)// 惰性初始化
pSelf= new Singleton();
return pSelf;
}
private:
static Singleton* pSelf;
}
class Singleton
{
private:
Singleton(){} //這裡需要特别注意,其他的構造函數
Singleton(const Singleton & sg){} //拷貝構造
Singleton operator=(const Singleton & sg){}
~Singleton(){}
public:
static Singleton* Instance()
{
//檢查成員變量是否已初始化,如果沒有的話,則建立一個新執行個體。
//多個線程同時執行的話不能達到隻建立一個執行個體的目的。
同步{ //如果同步的話考慮同步帶來的效率問題 --- 雙重檢驗鎖定
if(pSelf == NULL) //這裡是判斷是否已經建立了單例,不至于每次都要加鎖
{
lock();
if(pSelf == NULL)// 惰性初始化
pSelf= new Singleton();
unlock();
}
return pSelf;
}
private:
static Singleton* pSelf;
}
class Singleten
{
private:
Singleton(){} //這裡需要特别注意,其他的構造函數
Singleton(const Singleton & sg){} //拷貝構造
Singleton operator=(const Singleton & sg){}
~Singleten();
public:
static Singleten * GetInstance()
{
static Singleten gSingleten;
return &gSingleten;
}
}