日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

菜鸟之路-浅谈设计模式之单例设计模式

發(fā)布時間:2024/4/13 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 菜鸟之路-浅谈设计模式之单例设计模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

單例設(shè)計模式

定義:確保一個類僅僅有一個實例,并且自行實例化并向整個系統(tǒng)提供這個實例。



單例模式是一種經(jīng)常使用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中僅僅包括一個被稱為單例的特殊類。

通過單例模式能夠保證系統(tǒng)中一個類僅僅有一個實例并且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。假設(shè)希望在系統(tǒng)中某個類的對象僅僅能存在一個,單例模式是最好的解決方式。



關(guān)于單例設(shè)計模式的動機

對于系統(tǒng)中的某些類來說。僅僅有一個實例非常重要,比如。一個系統(tǒng)中能夠存在多個打印任務(wù),可是僅僅能有一個正在工作的任務(wù);一個系統(tǒng)僅僅能有一個窗體管理器或文件系統(tǒng);一個系統(tǒng)僅僅能有一個計時工具或ID(序號)生成器。如在Windows中就僅僅能打開一個任務(wù)管理器。

假設(shè)不使用機制對窗體對象進行唯一化,將彈出多個窗體。假設(shè)這些窗體顯示的內(nèi)容全然一致,則是反復對象。浪費內(nèi)存資源;假設(shè)這些窗體顯示的內(nèi)容不一致。則意味著在某一瞬間系統(tǒng)有多個狀態(tài),與實際不符。也會給用戶帶來誤解,不知道哪一個才是真實的狀態(tài)。

因此有時確保系統(tǒng)中某個對象的唯一性即一個類僅僅能有一個實例非常重要。
怎樣保證一個類僅僅有一個實例而且這個實例易于被訪問呢?定義一個全局變量能夠確保對象隨時都能夠被訪問。但不能防止我們實例化多個對象。

一個更好的解決的方法是讓類自身負責保存它的唯一實例。這個類能夠保證沒有其它實例被創(chuàng)建。而且它能夠提供一個訪問該實例的方法。

這就是單例模式的模式動機


關(guān)于單例設(shè)計模式的要點

單例模式的要點有三個。一是某個類僅僅能有一個實例。二是它必須自行創(chuàng)建這個實例;三是它必須自行向整個系統(tǒng)提供這個實例。
從詳細實現(xiàn)角度來說,就是下面三點:一是單例模式的類僅僅提供私有的構(gòu)造函數(shù),二是類定義中含有一個該類的靜態(tài)私有對象,三是該類提供了一個靜態(tài)的公有的函數(shù)用于創(chuàng)建或獲取它本身的靜態(tài)私有對象。

Java實例:

當一個類的實例能夠有且僅僅能夠一個的時候就須要用到了。為什么僅僅須要有一個呢?有人說是為了節(jié)約內(nèi)存。但這僅僅是單例模式帶來的一個優(yōu)點。僅僅有一個實例確實降低內(nèi)存占用。但是我覺得這不是使用單例模式的理由。

我覺得使用單例模式的時機是當實例存在多個會引起程序邏輯錯誤的時候。比方類似有序的號碼生成器這種東西。怎么能夠同意一個應(yīng)用上存在多個呢?



餓漢式單例

public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; } }

懶漢式單例

public class Singleton { private static Singleton singleton; private Singleton(){} public static synchronized Singleton getInstance(){ if(singleton==null){ singleton = new Singleton(); } return singleton; } } 可是這樣的單例類型在多線程中是不安全。有可能會出現(xiàn)兩個INSTANCE,為什么呢?
假設(shè)當唯一實例尚未創(chuàng)建時,有兩個線程同一時候調(diào)用創(chuàng)建方法,那么它們同一時候沒有檢測到唯一實例的存在,從而同一時候各自創(chuàng)建了一個實例,這樣就有兩個實例被構(gòu)造出來,從而違反了單例模式中實例唯一的原則。 解決問題的辦法是為指示類是否已經(jīng)實例化的變量提供一個相互排斥鎖(詳見雙重鎖單例。盡管這樣會減少效率)。
比較:
餓漢式是線程安全的,在類創(chuàng)建的同一時候就已經(jīng)創(chuàng)建好一個靜態(tài)的對象供系統(tǒng)使用,以后不在改變。
懶漢式適合單線程。多線程情況下假設(shè)在創(chuàng)建實例對象時不加上synchronized則會導致對對象的訪問不是線程安全的。
從實現(xiàn)方式來講他們最大的差別就是懶漢式是延時載入,?
他是在須要的時候才創(chuàng)建對象,而餓漢式在載入類時創(chuàng)建實例。?
?餓漢式無需關(guān)注多線程問題、寫法簡單明了、能用則用。可是它是載入類時創(chuàng)建實例、所以假設(shè)是一個工廠模式、緩存了非常多實例、那么就得考慮效率問題,由于這個類一載入則把全部實例無論用不用一塊創(chuàng)建。 懶漢式的長處是延時載入、缺點是應(yīng)該用同步。

單例模式的長處:
在內(nèi)存中僅僅有一個對象。節(jié)省內(nèi)存空間。
避免頻繁的創(chuàng)建銷毀對象,能夠提高性能。
避免對共享資源的多重占用。
能夠全局訪問。




適用場景:

因為單例模式的以上長處,所以是編程中用的比較多的一種設(shè)計模式。

我總結(jié)了一下我所知道的適合使用單例模式的場景:
須要頻繁實例化然后銷毀的對象。
創(chuàng)建對象時耗時過多或者耗資源過多,但又經(jīng)經(jīng)常使用到的對象。


有狀態(tài)的工具類對象。
頻繁訪問數(shù)據(jù)庫或文件的對象。
以及其它我沒用過的全部要求僅僅有一個對象的場景。


單例模式注意事項:
僅僅能使用單例類提供的方法得到單例對象,不要使用反射。否則將會實例化一個新對象。


不要做斷開單例類對象與類中靜態(tài)引用的危急操作。
多線程使用單例使用共享資源時,注意線程安全問題。

雙重鎖形式單例(懶漢式進階版。哈哈)

public static class Singleton{private static Singleton instance=null;private Singleton(){//do something}public static Singleton getInstance(){if(instance==null){synchronized(Singleton.class){if(null==instance){instance=new Singleton();}}}return instance;} }(有些朋友搞不懂為什么要推斷兩次Instance==null,由于在多線程中第一次推斷時可能有兩個或者多個instance==null。那么在synchronized鎖里第一個instance已經(jīng)new出來了,第二個或者后面進入的假設(shè)不推斷就會反復new對象出來,所以在里面多一層推斷確保Instance實例僅僅有一個)
這樣還是有一個缺點就是:就是在一個線程還未全然初始化該對象時,而那個變量已經(jīng)顯示為被初始化,那么其它線程可能去使用這個未被全然初始化的實例,造成系統(tǒng)的崩潰。

只是這個在java5以上能夠安全執(zhí)行。


第二種完美實現(xiàn)的實現(xiàn)既線程安全又延遲載入的模式(Initialization on demand holder)使用靜態(tài)內(nèi)部類 ?演示樣例:

Public class Singleton{Private Singleton(){};Public static class Singleton1{Private static final Singleton instance = new Singleton(); } Public static Singleton getInstance(){Return Singleton1.instance; } }
這樣就能保證在第一次調(diào)用getInstance()方法時,才會去初始化instance實例,并且該實例被定義為static,僅僅會被初始化一次。(這樣的方法是網(wǎng)上看的,我還未用過,以后能夠試試。哈哈)

此文由本人從網(wǎng)上瀏覽總結(jié)而出。如需轉(zhuǎn)載,請注明出處,謝謝!





當一個類的實例能夠有且僅僅能夠一個的時候就須要用到了。為什么僅僅須要有一個呢?有人說是為了節(jié)約內(nèi)存,但這僅僅是單例模式帶來的一個優(yōu)點。僅僅有一個實例確實降低內(nèi)存占用,但是我覺得這不是使用單例模式的理由。我覺得使用單例模式的時機是當實例存在多個會引起程序邏輯錯誤的時候。比方類似有序的號碼生成器這種東西,怎么能夠同意一個應(yīng)用上存在多個呢?

總結(jié)

以上是生活随笔為你收集整理的菜鸟之路-浅谈设计模式之单例设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。