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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

设计模式学习(三)——单例模式

發布時間:2023/11/30 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式学习(三)——单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  在Java開發過程中,很多場景下都會碰到或要用到單例模式,在設計模式里也是經常作為指導學習的熱門模式之一,相信每位開發童鞋都用到過。我們總是沿著前輩的足跡去做設定好的思路,往往沒去探究為何這么做,所以這篇文章對單例模式做了詳解。

一、單例模式定義:

  單例模式確保某個類只有一個實例,而且自行實例化并向整個系統提供這個實例。在計算機系統中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業同時輸出到打印機中。每臺計算機可以有若干通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。

二、單例模式特點:
  1、單例類只能有一個實例。
  2、單例類必須自己創建自己的唯一實例。
  3、單例類必須給所有其他對象提供這一實例。

單例模式保證了全局對象的唯一性,比如系統啟動讀取配置文件就需要單例保證配置的一致性。

三、線程安全的問題

  一方面在獲取單例的時候,要保證不能產生多個實例對象,后面會詳細講到五種實現方式;

  另一方面,在使用單例對象的時候,要注意單例對象內的實例變量是會被多線程共享的,推薦使用無狀態的對象,不會因為多個線程的交替調度而破壞自身狀態導致線程安全問題,比如我們常用的VO,DTO等(局部變量是在用戶棧中的,而且用戶棧本身就是線程私有的內存區域,所以不存在線程安全問題)。

四、單例模式的選擇

  還記得我們最早使用的MVC框架Struts1中的action就是單例模式的,而到了Struts2就使用了多例。在Struts1里,當有多個請求訪問,每個都會分配一個新線程,在這些線程,操作的都是同一個action對象,每個用戶的數據都是不同的,而action卻只有一個。到了Struts2,?action對象為每一個請求產生一個實例,并不會帶來線程安全問題(實際上servlet容器給每個請求產生許多可丟棄的對象,但是并沒有影響到性能和垃圾回收問題,有時間會做下研究)。

五、實現單例模式的方法

1.餓漢式單例(立即加載方式)

/*** 餓漢式單例:餓漢式單例在單例類被加載時候,就實例化一個對象交給自己的引用* @author coco.xu* @date 2019-03-21*/ public class Singleton_1 {//在單例類被加載時候,就實例化一個對象交給自己的引用private static Singleton_1 singleton = new Singleton_1();//私有構造方法private Singleton_1(){}//靜態工廠方法public static Singleton_1 getInstance(){return singleton;} }

?

  餓漢式單例在類加載初始化時就創建好一個靜態的對象供外部使用,除非系統重啟,這個對象不會改變,所以本身就是線程安全的。
  Singleton通過將構造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內,Singleton的唯一實例只能通過getInstance()方法訪問。(事實上,通過Java反射機制是能夠實例化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做討論,姑且閉著眼就認為反射機制不存在。)

?2.懶漢式單例

/*** 懶漢式模式:懶漢式在調用取得實例方法的時候才會實例化對象* @author keke.xu* @date 2019-03-21*/ public class Singleton_2 {private static Singleton_2 singleton;//私有構造private Singleton_2(){}public static synchronized Singleton_2 getInstance(){if(singleton==null){singleton = new Singleton_2();}return singleton;} }

?

轉載于:https://www.cnblogs.com/cocoxu1992/p/10573593.html

總結

以上是生活随笔為你收集整理的设计模式学习(三)——单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。