設計模式 筆記 單例模式 Singleton

2021-12-29 20:27:08 字數 2960 閱讀 5005

//singleton 單例模式-----物件建立型模式

1:意圖:

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

2:動機

3:適用性:

1>當類只能有乙個例項而且客戶可以從乙個眾所周知的訪問點訪問它時。

2>當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改**

就能使用乙個擴充套件的例項時。

4:結構:

singleton:

static instance()

singletonoperation()

getsingletondata()

static uniqueinstance

singletondata

5:參與者:

singleton:

1>定義乙個instance操作,允許客戶訪問它的唯一例項。instance時乙個類操作:

就是c++中的乙個靜態成員函式。

2>可能負責建立它自己的唯一例項。

6:協作:

客戶只能通過singleton的instance操作訪問乙個singleton例項。

7:效果:

1>對唯一例項的受控訪問:

因為singleton類封裝它的唯一例項,所以它可以嚴格的控制客戶怎樣以及何時訪問它。

2>縮小名空間:

singleton模式是對全域性變數的一種改進。它避免了那些儲存唯一例項的全域性變數汙染名空間。

3>允許對操作和表示的精華:

singleton類可以有子類,而且用這個擴充套件類的例項來配置乙個應用是很容易的。

可以用需要的類的例項在執行時刻配置應用。未知標

4>允許可變數目的例項:

通過改變允許訪問singleton例項的操作,來實現控制應用所使用的例項的數目。

5>比類操作更靈活:

另一種封裝單件功能的方式是使用類操作:就是靜態成員函式。

8:實現:

1>保證乙個唯一的例項:

就是使用乙個類操作來獲得例項: */

//這樣實現是有執行緒安全問題的

class singleton

public:

static singleton* instance();

protected:

singleton();

private:

static singleton* _instance;

singleton* singleton::_instance = 0;

singleton* singleton::instance()

if(_instance == 0)

_instance = new singleton;

return _instance;

// 2>建立singleton類的子類:

// 使用單件登錄檔:

class singleton

public:

static void register(const char* name, singleton*);

static singleton* instance();

protected:

static singleton* lookup(const char* name);

private:

static singleton* _instance;

static map _registry; //感覺map更好用

singleton* singleton::instance()

if(_instance == 0)

const char* singletonname = getenv(singleton);

_instance = lookup(singletonname);

return _instance;

//子類註冊:在建構函式中註冊自己

mysingleton::mysingleton()

singleton::register(mysingleton, this);

//這個建構函式只有被呼叫了,登錄檔中才有mysingleton,所以要在實現檔案中定義乙個靜態例項

static mysingleton thesingleton;

// 9:**示例:

class mazefactory

public:

static mazefactory* instance();

static void register(const char* name, mazefactory*);

protected:

mazefactory();

static mazefactory* lookup(const char* name);

private:

static mazefactory* _instance;

static map _registry;

mazefactory* mazefactory::_instance = 0;

mazefactory* mazefactory::instance()

if(_instance = 0)

const char* mazename = getenv(mazestyle);

_instance = lookup(mazename);

return _instance;

void mazefactory::register(const char* name, mazefactory* fac)

_registry.insert(std::make_pair(name,fac));

mazefactory* mazefactory::lookup(const char* name)

map::iterator it=_registry.find(name);

if(it != _registry.end())

return it.second;

return 0;

設計模式筆記 單例模式

單例模式在系統開發時很常見,乙個系統中可能會有多個單例模式的運用!它比全域性變數的好處?1.能控制生成時間,保證初始化順序?2.容易保證執行緒安全 全域性變數需要多執行緒client單獨控制併發,單例在類實現中已經做到,無需client再處理 3.減少函式模組之間的耦合,減少命名衝突,便於管理?可能...

設計模式筆記 單例模式

1 懶漢式 1 執行緒不安全 public class singleton public static singleton getinstance return singleton 缺點 不支援多執行緒。2 執行緒安全 public class singleton public static syn...

設計模式筆記 單例模式

單例模式 保證乙個類只有乙個例項,並提供乙個方法訪問它的全域性訪問點。singleton類,定義乙個 getinstance 方法,允許客戶訪問它的唯一例項。getinstance 是乙個靜態方法,主要負責建立自己的唯一例項。public class singleton public static ...