設計模式之單例模式

2021-07-09 17:22:01 字數 1833 閱讀 1206

單例模式的要點有三個;一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。

具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式,二是類定義中含有乙個該類的靜態私有物件,三是該類提供了乙個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。

《設計模式》一書中給出了一種很不錯的實現,定義乙個單例類,使用類的私有靜態指標變數指向類的唯一例項,並用乙個公有的靜態方法獲取該例項。

c++**:

class singleton  

static singleton *m_pinstance;

public:

static singleton * getinstance()

};

不知你有沒有發現這樣的實現都不會出現問題。m_pinstance指向的空間什麼時候釋放呢?

可以在程式結束時呼叫getinstance(),並對返回的指標掉用delete操作。這樣做可以實現功能,但容易出錯。因為這樣的附加**很容易被忘記,而且也很難保證在delete之後,沒有**再呼叫getinstance函式。

乙個妥善的方法是讓這個類自己知道在合適的時候把自己刪除,

使其在恰當的時候被自動執行。

我們知道,程式在結束的時候,系統會自動析構所有的全域性變數。系統也會析構所有的類的靜態成員變數,就像這些靜態成員也是全域性變數一樣。利用這個特徵,我們可以在單例類中定義乙個這樣的靜態成員變數,而它的唯一工作就是在析構函式中刪除單例類的例項。如下面的**中的garbo類:

class singleton  

static singleton *m_pinstance;

class garbo //它的唯一工作就是在析構函式中刪除csingleton的例項

};

static garbo garbo; //定義乙個靜態成員變數,程式結束時,系統會自動呼叫它的析構函式

public:

static singleton * getinstance()

};

程式執行結束時,系統會呼叫csingleton的靜態成員garbo的析構函式,該析構函式會刪除單例的唯一例項。

考慮到執行緒安全、異常安全,還需要進行優化:

c++**:

class lock  

~lock()

};

class singleton

;

singleton* singleton::pinstance = 0;

singleton* singleton::instantialize()

} return pinstance;

}

之所以在instantialize函式裡面對pinstance 是否為空做了兩次判斷,因為該方法呼叫一次就產生了物件,pinstance == null大部分情況下都為false,如果按照原來的方法,每次獲取例項都需要加鎖,效率太低。而改進的方法只需要在第一次 呼叫的時候加鎖,可大大提高效率。

使用單例的優點:

1、對於那些比較耗記憶體的類,只例項化一次可以大大提高效能,尤其是在移動開發中。

2、保持程式執行的時候該中始終只有乙個例項存在記憶體中

android使用場景:

1、在android中使用可以管理activity的工具類。

2、用單例模式建立乙個activity管理物件,進而管理activity退出。

cocos2d使用場景:

ccdirector類是單例的,它以棧的方式處理scenes的呼叫,並且知道當前哪個scene是啟用狀態。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...