作用:保證為乙個類只生成唯一的例項物件。也就是說,在整個程式空間中,該類只存在乙個例項物件
構造圖如下:
為什麼需要單例模式:
1、在多個執行緒之間,比如初始化一次socket資源
2、在整個程式空間使用全域性變數,共享資源
3、大規模系統中,為了效能的考慮,需要節省物件的建立時間
實現步驟:
1、建構函式私有化
2、提供乙個全域性的靜態方法(全域性訪問點)
3、在類中定義乙個靜態指標,指向本類的變數的靜態變數指標
單例模式分類及實現:
#include
using
namespace
std;
// 懶漢式單例
class usermanage
public:
static usermanage* getinstanc()
handle_count++;
return m_instance;
}static
void release() // 釋放控制代碼
}private:
static usermanage *m_instance; // 物件指標,物件控制代碼
static
int handle_count; // 引用計數
};// 靜態變數在類的外部進行初始化
usermanage *usermanage::m_instance = null;
int usermanage::handle_count = 0;
void func()
int main1()
else
usermanage::release(); // 釋放
return0;}
/*類中存放兩個靜態變數,乙個是物件控制代碼,乙個是計數常量,定義好後必須在類外部進行初始化,這是類的屬性。還有兩個函式,乙個是獲取控制代碼,如果控制代碼為空,則new乙個新的控制代碼,並且計數加1,然後返回控制代碼;還有乙個是釋放控制代碼,首先計數減一,然後delete控制代碼並置為空防止出現野指標。懶漢式是當你使用時,他才會建立新的控制代碼。
*/
懶漢式加鎖的情況:
#include
#include
using namespace std;
// 懶漢式單例
class usermanage
public:
static usermanage* getinstance()
pthread_mutex_unlock(&mutex); // 解鎖
}handle_count++;
return m_instance;
}static
void release() // 釋放控制代碼
pthread_mutex_unlock(&mutex); // 解鎖
}static
void *func(void *v) // void *func(usermanage *const this, void *v)
void run()
private:
static pthread_mutex_t mutex; // 物件指標鎖
static usermanage *m_instance; // 物件指標,物件控制代碼
static
int handle_count; // 引用計數
};// 靜態變數在類的外部進行初始化
usermanage *usermanage::m_instance = null;
int usermanage::handle_count = 0;
pthread_mutex_t usermanage::mutex = pthread_mutex_initializer; // 對鎖進行初始化
void* func(void *v)
int main()
pthread_exit(null); // 主線程退出,不影響其他執行緒執行
*/ pthread_t id[10];
for (int i = 0; i < 10; i++)
for (int i = 0; i < 10; i++)
return
0;}
#include
using
namespace
std;
// 餓漢式單例
class usermanage
public:
static usermanage* getinstanc()
static
void release() // 釋放控制代碼
}private:
static usermanage *m_instance; // 物件指標,物件控制代碼
static
int handle_count; // 引用計數
};// 靜態變數在類的外部進行初始化
usermanage *usermanage::m_instance = new usermanage;
int usermanage::handle_count = 0;
void func()
int main()
else
usermanage::release(); // 釋放
return0;}
/*餓漢式和懶漢式**上最直接的區別就是餓漢式控制代碼生成時就已經分配好空間,而懶漢式則是在呼叫獲取控制代碼的函式中才分配空間。
*/
總結一下,兩種方案的建構函式和公用方法都是靜態的(static),例項和公用方法又都是私有的(private)。但是餓漢式每次呼叫的時候不用做建立,直接返回已經建立好的例項。這樣雖然節省了時間,但是卻占用了空間,例項本身為static的,會一直在記憶體中帶著。懶漢式則是判斷,在用的時候才載入,會影響程式的速度。最關鍵的是,在併發的情況下,懶漢式是不安全的。如果兩個執行緒,我們稱它們為執行緒1和執行緒2,在同一時間呼叫getinstance()方法,如果執行緒1先進入if塊,然後執行緒2進行控制,那麼就會有兩個例項被建立。
比較:
餓漢式是執行緒安全的,在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不在改變
懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的
推薦使用第一種
從實現方式來講他們最大的區別就是懶漢式是延時載入,
他是在需要的時候才建立物件,而餓漢式在虛擬機器啟動的時候就會建立,
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會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...