關與C中使用singleton設計模式的問題

2023-01-13 09:40:34 字數 3326 閱讀 2643

1樓:宣義坊的大螞蟻

首先,物件導向的設計中比較忌諱靜態類,因為它不是物件導向的!

然後靜態類是在assembly載入的時候進行初始化,不能變更,單件模式的普通類更加靈活。

最後,你給出的做法並不是一個很好的選擇,一般的說是這樣的:

sealed class singletonreturn singleton._instance;}}實用的時候只需要singleton.getinstance()即可。

ps:更加靈活是指這個單間的構造時間更加靈活,比如我上面的例子裡面,如果沒有人執行singleton.getinstance(),那麼singleton.

_instance就會一直是空,而不佔用記憶體。如果使用在static filed定義的時候就例項化,相當於在assembly載入起來的時候就為singleton._instance賦值,不管是否被使用,佔用記憶體是肯定的了:)

2樓:泉水叮咚

用靜態成員變數來實現單件模式, 是利用了c#的語言特性。

即:延遲載入 (lazy load),和執行緒安全。

就是說,當外界沒有訪問這個instance的時候,他是沒有例項化的, 當外界訪問了這個instance的時候, c#就會呼叫這個類的預設靜態建構函式去例項化這個instance。 實際上編譯器會把這個**instance=new singleton(); 放到類的靜態建構函式裡。

由於c#類的靜態建構函式只能一個執行緒訪問,所以保證了執行緒安全。

當然你也可以用另外的方法實現。最終實現的結果是一樣的:即某個類有且只有一個例項。

3樓:匿名使用者

不是的…靜態類可以是多例的…比如path,file,directory,math類…而單例模式只能有一個例項…但建立單例卻可以通過靜態類或者new例項類…總的來說單例是一種建立模式,而靜態類的設計多數是為了簡化建立過程,簡化使用

ps:不好意思,我對靜態類理解不夠(認為多執行緒下static是不安全的)!剛查了下資料,static下,多執行緒呼叫時,只能有一個執行緒能訪問static,其它執行緒會被阻塞直到該執行緒執行完…

且靜態類不儲存狀態、不能new例項、不能承繼,僅提供一些靜態方法或屬性訪問…單例卻有裝態,能new也能承繼、但始終保持一個例項…靜態類只不過是一些方法的集合,而單例卻是一個類的例項…

希望對你有幫助!我也在學設計模式,有時間能交流下…q81769687

4樓:

singleton你沒有理解當中的意思,也就說這樣的例項我保證他只是例項化了一次,如果為空,我才將它例項化,比如說連線資料庫的sqlconnection這樣的例項我們只需要例項化一次,如果為空我才將它例項化,如果不為空,就不再例項化,這種也不是什麼模式,而是一種很簡單的處理方式而以!

class singleton設計模式有什麼用處

5樓:匿名使用者

能保證只有一個例項存在。

比如印表機程式,只有一臺印表機,如果有多個使用者連線並且列印,那印表機怎麼工作,列印誰的呢?所以要用singleton, 保證此時此刻只能有一個列印例項,當這個列印例項完成列印,把這個例項給別人用,一個一個來,不然就亂套了。

6樓:匿名使用者

單例模式。保證一個類只有一個例項的時候。確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。

7樓:

單執行緒,如果你做的系統能在伺服器上建立出資料夾,剛好又能多個人操作,那麼如果同時生成資料夾就悲劇了。。。這樣單執行緒避免了這些問題

大家對於學習c#設計模式有沒有好的建議?

8樓:匿名使用者

說一下自己的感受吧,希望對你有用。

1、可以先了解一下所謂的23種設計模式,但開始時並一定要用到自己的專案當中。

2、要獨立或對某個專案有很好的瞭解,在參與專案時,允許自己走一些彎路,但要有思考,在保證正常工作的情況下,讓自己更少的去維護自己的**,提高自己**的重用度,就是別讓**左右自己

3、回過頭來再學習設計模式,一邊對照自己的專案一邊學習,同時考慮自己專案當中有哪些需要優化,哪些可以更合理一些,但並不要求能馬上改。但在這次學習後,要時刻提醒自己,以後寫的**能儘可能的向設計模式上靠

4、此時在是在一邊學習一邊向設計模式上靠,允許自己的**對設計模式的錯誤使用

5、活學活用,即脫離設計模式,發揮一些自己總結的經驗去做專案,此時自己已經有一定的基礎,這時可能做出的東西,就相對不錯

現在自己也在學習這個設計模式,在一邊做專案一邊思考,怎麼對專案進行優化,整理,怎麼在下次寫**時設計的更合理。還要再去學習設計模式。

有個建議:

找個較好的開源專案去學習,畫出其中的uml類圖,並且學習其中的優秀寫法,同時還要對物件導向有一定的瞭解。介面、抽象類、組合關係、聚合關係、封裝、繼承、多型,真的要了解了之後對設計模式才能理解的更好。

9樓:北川怨魂

建議有了一定的開發經驗再去學習設計模式。否則設計模式會讓你掉入坑裡。

10樓:

有本書叫做大話設計模式 看看吧

誰能告訴我c#的23種設計模式是哪些!!急!!!

11樓:草薙在

建立型:

1. 單件模式(singleton pattern)2. 抽象工廠(abstract factory)3. 建造者模式(builder)

4. 工廠方法模式(factory method)5. 原型模式(prototype)

結構型:

6. 介面卡模式(adapter pattern)7. 橋接模式(bridge pattern)8.

裝飾模式(decorator pattern)9. 組合模式(composite pattern)10. 外觀模式(facade pattern)11.

享元模式(flyweight pattern)12. **模式(proxy pattern)13. 模板方法(template method)14.

命令模式(command pattern)15. 迭代器模式(iterator pattern)行為型:

16. 觀察者模式(observer pattern)17. 直譯器模式(interpreter pattern)18.

中介者模式(mediator pattern)19. 職責鏈模式(chain of responsibility pattern)

20. 備忘錄模式(memento pattern)21. 策略模式(strategy pattern)22.

訪問者模式(visitor pattern)23. 狀態模式(state pattern)

C中使用DrawString繪製文字時怎樣使文字居中或右對齊

void 繪製文字zhi graphics 畫家 如上。如滿意,請採納,謝謝。c 中使用drawstring繪製文字時怎樣使文字居中或右對齊 format.linealignment stringalignment.center 更正 bai 垂直居中 duformat.alignment stri...

c 中使用陣列對數值進行排序(選擇排序法)?

c 都幫你封裝好了 無腦呼叫sort函式就行了。c 中陣列的排序方法有哪些呢?除了氣泡排序 sort方法和reverse方法,c 還提供了許多其他的排序演算法和方法。下面對常用的排序方法進行簡要介紹 氣泡排序 bubble sort 氣泡排序是一種簡單的排序演算法,它通過比較兩個相鄰的元素,將較大的元素...

怎樣使C語言全域性變數在多個檔案中使用

extern 關鍵字 extern int i 這樣就可以在其他檔案中使用在標頭檔案中宣告版 a.hextern int i 在其他某 個c檔案中定義權 int i 0 其他要使用i變數的c原始檔只需要include a.h 就可以 c語言中如何在多個檔案中引用同一個結構體 把結構體定義在一個公共標...