幾種“單例”模式之間的區別

來源:互聯網
上載者:User
“單例”的概念是說,資料,在指定的範圍內,只有一份。
這個所謂的“指定的範圍”可能是每進程、每AppDomain、每線程,也可能是每調用。為了在指定的範圍內“單例”,可能要採用不同的技術。比方說一個普通的靜態屬性Instance可以提供很happy的每AppDomain範圍;一個ThreadStaticAttribute修飾的static域可以提供每線程範圍;一個CallContextStaticAttribute(這東東得自訂,回頭帖個實現)來提供每調用範圍等等。

今天主要討論不是這些範圍如何如何,是單例的實現方式之間的不同。下面,我們假設一個進程中唯一的一個AppDomain中實現單例。

從實現上來說,“單例”一般有三種方式:
1、static class。該類中的方法、屬性、變數統統都只有一份。
2、一個靜態Insatnce屬性或getInstance()方法,也就是標準的Singleton模式。
3、Monostate模式。

對1,那沒啥可說的,沒有繼承,也就沒有多態,比較死板,在類第一次被使用時初始化。
對2,可以繼承,有多態,問題在於所有的衍生類別都得自己實現Instance屬性或者getInstance方法才能使衍生類別也是Singleton。在第一次使用Instance屬性或調用getInstance方法時初始化。
對3,可以繼承,可以多態。內部依靠多個執行個體對象共用相同的靜態變數(跟享元模式類似。flyweight,每次看到這個中文翻譯都敬仰的一塌糊塗)達到資料只有一份的目的。衍生類別天生就是Singleton的。

依據需求,簡單應用就直接1;對2,還沒碰到過不能用1代替的情況,基本上也沒啥變態需求要重載Singleton的某些功能;對3,唯一用過的地方是資料一部分是每AppDomain範圍,一部分是每調用“單例”,對不同的調用,每調用“單例”中的資料不同。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.