C語言之單件模式完全實現

2021-06-18 05:34:59 字數 2266 閱讀 2039

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...