singleton模式
singleton可以說是《design pattern》中最簡單也最實用的乙個設計模式。那麼,什麼是singleton?
顧名思義,singleton就是確保乙個類只有唯一的乙個例項。singleton主要用於物件的建立,這意味著,如果某個類採用了singleton模式,則在這個類被建立後,它將有且僅有乙個例項可供訪問。很多時候我們都會需要singleton模式,最常見的比如我們希望整個應用程式中只有乙個連線資料庫的connection例項;又比如要求乙個應用程式中只存在某個使用者資料結構的唯一例項。我們都可以通過應用singleton模式達到目的。
一眼看去,singleton似乎有些像全域性物件。但是實際上,並不能用全域性物件代替singleton模式,這是因為:其一,大量使用全域性物件會使得程式質量降低,而且有些程式語言例如c#,根本就不支援全域性變數。其二,全域性物件的方法並不能阻止人們將乙個類例項化多次:除了類的全域性例項外,開發人員仍然可以通過類的建構函式建立類的多個區域性例項。而singleton模式則通過從根本上控制類的建立,將"保證只有乙個例項"這個任務交給了類本身,開發人員不可能再有其它途徑得到類的多個例項。這一點是全域性物件方法與singleton模式的根本區別。
singleton模式的實現
singleton模式的實現基於兩個要點:
1)不直接用類的建構函式,而另外提供乙個public的靜態方法來構造類的例項。通常這個方法取名為instance。public保證了它的全域性可見性,靜態方法保證了不會建立出多餘的例項。
2)將類的建構函式設為private,即將建構函式"隱藏"起來,任何企圖使用建構函式建立例項的方法都將報錯。這樣就阻止了開發人員繞過上面的instance方法直接建立類的例項。
#include
#inlcude
#inlucde
#define true 1
#define flase 0
typedef struct stu;
static stu* get_mem(int flage)
static stu *pstu = null;
if(true == flage)
if(null != pstu)
printf("the object is exist!\n");
return pstu;
else
pstu = (stu *)malloc(sizeof(stu));
if(null == pstu)
perror("malloc is faild!\n");
return null;
else
printf("malloc is success!\n");
return pstu;}}
}else if(false == flage)
if(null != pstu)
printf("free memory!\n");
free(pstu);
pstu = null;
return pstu;
else
printf("the point is null!\n");
return pstu;}}
}stu *get_object()
stu *ps = get_mem(true);
return ps;
}void free_object()
stu *p = get_mem(false);
printf("free is over!\n");
}int main()
stu *s1 = get_object();
stu *s2 = get_object();
free_object();
return 0;
}注:一定要注意malloc後,必須要free,否則會操作記憶體洩露。
單例適用場景:
在模組化設計時,應該遵循耦合度越低越好,但是總是存在一些公共的呼叫函式庫或者模組,這些公共的呼叫函式庫或者模組有以下幾個特點:
1、需要被其他的模組使用
2、其他模組之間並不知道對方使用會去呼叫或者初始化
3、公共的呼叫函式庫或者模組卻希望在整個系統中初始化一次。
這種模組其實也很常見,
比如:執行緒池(
整個系統希望只有那麼執行緒,其他模組不能執行緒)。
再比如:記憶體池,整個系統中只能存在這麼乙個記憶體池。
總結:在實際應用中singleton很可能是乙個資料結構, 這個結構中必然需要一把鎖,來保證對全域性變數singleton
使用的正確性。
C語言單件模式
有過面試經驗的朋友,或者對設計模式有點熟悉的朋友,都會對單件模式不陌生。對很多面試官而言,單件模式更是他們面試的保留專案。其實,我倒認為,單件模式算不上什麼設計模式。最多也就是個技巧。單件模式要是用c 寫,一般這麼寫。cpp view plain copy include include class...
C語言之單鏈表實現
鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。相比於線性表順序結構,操作複雜。由於...
單件模式(c )
單件模式是設計模式中最簡單的模式了。定義 確保乙個類只有乙個例項,並提供乙個全域性的訪問點。看下 的實現 class singleton 2 5 public 6 singleton 7 8static shared ptrgetinstance 9 else 15 16private 17stat...