国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

三言兩語說透設計模式的藝術-單例模式

來源: 責編: 時間:2023-08-05 11:44:51 5046觀看
導讀寫在前面單例模式是一種常用的軟件設計模式,它所創建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統中的其他對象共享,從而減少系統中的資源開銷。單例模式單例模式的實現

寫在前面

單例模式是一種常用的軟件設計模式,它所創建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統中的其他對象共享,從而減少系統中的資源開銷。Qvu28資訊網——每日最新資訊28at.com

單例模式

單例模式的實現思路是:Qvu28資訊網——每日最新資訊28at.com

  1. 構造函數需要被私有化,外部無法直接通過new來創建對象實例。
  2. 提供一個靜態的公有訪問點,用于獲取單例對象的實例。
  3. 通過判斷實例是否已經存在來決定創建或直接返回現有實例。

單例模式的要點:Qvu28資訊網——每日最新資訊28at.com

  • 某個類只能有一個實例
  • 它必須自行創建實例
  • 它必須自行向整個系統提供整個實例

我們來看一下使用TypeScript實現單例模式的代碼示例:Qvu28資訊網——每日最新資訊28at.com

class Singleton {  // 私有靜態屬性,存儲唯一實例  private static instance: Singleton;  // 私有構造函數,防止外部實例化  private constructor() {}  // 向外部提供能夠共享訪問的唯一實例  public static getInstance(): Singleton {    if (!Singleton.instance) {      Singleton.instance = new Singleton();    }    return Singleton.instance;  }  // 其他方法和屬性}const s1 = Singleton.getInstance(); const s2 = Singleton.getInstance();console.log(s1 === s2); // true

上面代碼中,Singleton類的構造函數被private修飾,使其無法在類的外部通過new來創建實例。Qvu28資訊網——每日最新資訊28at.com

getInstance方法首先會判斷實例是否存在,如果不存在才去新建實例,如果實例已存在則直接返回現有實例。這確保了整個程序中只會創建該類的一個實例。Qvu28資訊網——每日最新資訊28at.com

測試代碼中,s1和s2實際上是獲取的是同一個實例對象。Qvu28資訊網——每日最新資訊28at.com

圖片圖片Qvu28資訊網——每日最新資訊28at.com

單例模式的優點:Qvu28資訊網——每日最新資訊28at.com

  • 對唯一實例的受控訪問。
  • 由于單例對象存放在靜態變量中,所以可以直接通過類名訪問,簡單方便。
  • 可以避免對資源的重復占用。

單例模式的缺點:Qvu28資訊網——每日最新資訊28at.com

  • 沒有抽象層,擴展困難。
  • 單例類的職責過重,違反單一職責原則。
  • 沒有接口,依賴具體實現,導致擴展性差。

Singleton單例:在單例類的內部實現只生成一個實例,同時提供一個靜態方法getInstance()方法,讓用戶可以訪問它的唯一實例;為了防止在外部對單例類實例化,它的構造函數可見性為private;在單例類內部定義了一個Singleton類型的靜態屬性instance,作為提供給外部共享訪問的唯一實例。Qvu28資訊網——每日最新資訊28at.com

餓漢式單例類

餓漢式單例類:當類被加載時,靜態屬性instance會被初始化,此時類的私有構造函數會被調用,單例類的唯一實例將會被創建。Qvu28資訊網——每日最新資訊28at.com

普通單例模式和餓漢式單例模式的區別:Qvu28資訊網——每日最新資訊28at.com

  • 普通單例模式是在第一次調用getInstance方法時才創建實例對象。
  • 餓漢式是無論是否調用都會在類加載時就創建實例對象。

下面我們使用TypeScript代碼實現一個餓漢式單例:Qvu28資訊網——每日最新資訊28at.com

class Singleton {  private static instance = new Singleton();    private constructor() {}  public static getInstance() {    return Singleton.instance;  }}const s1 = Singleton.getInstance();const s2 = Singleton.getInstance(); console.log(s1 === s2); // true

餓漢式單例由于在類加載時就完成了初始化,所以理論上它是線程安全的,在多線程環境下也能保證單例。Qvu28資訊網——每日最新資訊28at.com

但餓漢式也有可能造成不必要的實例化,如果這個單例的實例對象較大,而客戶端又沒調用getInstance方法,那就會浪費內存。Qvu28資訊網——每日最新資訊28at.com

懶漢式單例模式

其實懶漢式單例模式,就是前面提到的普通單例模式。Qvu28資訊網——每日最新資訊28at.com

懶漢式單例模式實現代碼如下:Qvu28資訊網——每日最新資訊28at.com

class Singleton {  private static instance: Singleton;  private constructor() {}  public static getInstance(): Singleton {    if (!Singleton.instance) {      Singleton.instance = new Singleton();    }    return Singleton.instance;   }}

但是,這種實現方式存在一個問題,就是在多線程環境下會存在安全隱患。Qvu28資訊網——每日最新資訊28at.com

如果有兩個線程A和B,它們同時調用 getInstance 方法,并且實例還沒有被初始化,那么它們會同時執行 Singleton.instance = new Singleton();這行代碼。Qvu28資訊網——每日最新資訊28at.com

這樣就會導致實際創建了兩個實例,違反了單例模式的初衷。Qvu28資訊網——每日最新資訊28at.com

為了使懶漢式單例在多線程中也是安全的,我們可以對getInstance方法加鎖:Qvu28資訊網——每日最新資訊28at.com

class Singleton {  private static instance: Singleton;  private constructor() {}  public static getInstance(): Singleton {    if (!Singleton.instance) {      // 加鎖      lock()        if (!Singleton.instance) {        Singleton.instance = new Singleton();      }      // 釋放鎖       unlock()    }    return Singleton.instance;  }}

這樣當一個線程進入該方法時,其它線程就只能等待,直到鎖被釋放后才能進入方法。Qvu28資訊網——每日最新資訊28at.com

這就確保了單例實例的唯一性。這里的鎖機制可以使用互斥量mutex等各種鎖的實現。Qvu28資訊網——每日最新資訊28at.com

以上是關于懶漢式單例線程安全性問題的一個補充說明。讓我們的單例模式實現更加健壯。Qvu28資訊網——每日最新資訊28at.com

餓漢式單例與懶漢式單例類比較

  1. 實例化時機不同
  • 懶漢式是在第一次調用getInstance時才實例化Singleton對象
  • 餓漢式是在類加載時就實例化了Singleton對象
  1. 資源利用效率不同
  • 懶漢式更節約資源,按需實例化,如果一直沒有調用getInstance也不會實例化
  • 餓漢式不管是否需要都會實例化,如果長時間沒有使用就會浪費內存
  1. 多線程安全性不同
  • 餓漢式天然是多線程安全的,因為實例在類加載時就已經創建好了
  • 懶漢式需要額外的同步機制來保證多線程安全
  1. 使用場景不同
  • 懶漢式更適合實例化過程比較耗時或耗資源的情況
  • 餓漢式更適合實例化過程很快且確定會用到的情況

懶漢式相比餓漢式更加靈活,但需要處理多線程安全問題。餓漢式編寫簡單但不太高效。Qvu28資訊網——每日最新資訊28at.com

在實際開發中,我們可以根據需求選擇合適的實現方式,也可以采用雙重校驗鎖等線程安全的懶漢式實現。Qvu28資訊網——每日最新資訊28at.com

一種更好的單例實現方式

餓漢式單例類不能實現延遲加載,不管將來用不用,它始終占據內存;懶漢式單例類線程安全控制繁瑣,而且性能收到影響。對此,無論是餓漢式單例還是懶漢式單例都在一些問題,使用IoDH(Initialization on Demand Holder)可以結合兩者的優點,克服兩者的缺點實現性能和實現更優的單例模式。Qvu28資訊網——每日最新資訊28at.com

IoDH是一種技術方案,它利用了類的靜態屬性來實現延遲加載和線程安全。要實現IoDH,只需在但李磊中增加靜態內部類即可,在該內部類中創建單例對象,再將該單例對象通過getInstance()方法返回給外部使用。Qvu28資訊網——每日最新資訊28at.com

// 單例服務接口interface SingletonService {  doSomething(): void; }// 單例服務類class SingletonServiceImpl implements SingletonService {  doSomething() {    console.log('Doing something...');  }}// IoC容器類class IoCContainer {  private singleton: SingletonService;  constructor() {    this.singleton = new SingletonServiceImpl();  }  getSingleton(): SingletonService {    return this.singleton;  }}// 測試代碼const container = new IoCContainer();const s1 = container.getSingleton();const s2 = container.getSingleton();console.log(s1 === s2); // true

詳細解析一下使用IoC容器實現單例模式的代碼:Qvu28資訊網——每日最新資訊28at.com

  1. 定義了單例服務接口SingletonService,用于規范單例對象的操作。
  2. SingletonServiceImpl實現了該接口,作為單例對象的具體實現類。
  3. IoC容器類IoCContainer在內部持有SingletonService類型的成員變量singleton。
  4. IoC容器類的構造函數中會實例化這個singleton對象,確保全局只有這一個實例。
  5. getSingleton()方法用來返回這個singleton實例。
  6. 在測試代碼中,從IoC容器中獲取了兩次單例對象,并比較它們的引用是否相同。
  7. 運行結果證明兩次獲取的確是同一個對象引用,即單例。

這樣通過IoC容器管理單例的創建,可以實現:Qvu28資訊網——每日最新資訊28at.com

  1. 把單例對象的創建和生命周期管理轉移到IoC容器。
  2. 外部代碼不需要關心單例內部的具體實現,只需要從容器中獲取實例即可。
  3. 符合單一職責原則,程序邏輯更清晰。
  4. 有利于代碼的可測試性,可以通過mock容器進行單元測試。
  5. 擴展性較好,如果要切換不同的單例實現,只需要調整容器中的對象創建即可。

總結

單例模式作為一種設計模式,由于具有明確的目的、簡單的結構和易于理解的特點,在軟件開發中使用頻率很高,在許多應用程序和框架中都有廣泛應用。Qvu28資訊網——每日最新資訊28at.com

  1. 單例模式的主要優點包括:提供對唯一實例的受控訪問,由于全局只存在一個實例,因此可以節約系統資源;允許擴展為可變數量的實例,既節約資源又解決過度共享影響性能的問題。
  2. 單例模式的主要缺點包括:沒有抽象層導致擴展性差;違反單一職責原則,將實例化和業務邏輯混合在一起;在支持垃圾回收的運行時環境下可能導致狀態丟失。
  3. 使用單例模式的典型場景包括:系統只需要一個實例;客戶只能通過一個公共訪問點獲取實例;需要節約資源的頻繁創建銷毀對象。

總之,單例模式是一種利用率較高的設計模式,其限制實例個數的特點可以帶來節省資源的優勢,但也可能導致擴展性較弱以及與語言環境不夠匹配等問題。在軟件設計中,開發者需要權衡考慮系統的需求和優缺點,適當使用單例模式。Qvu28資訊網——每日最新資訊28at.com

Qvu28資訊網——每日最新資訊28at.com

本文鏈接:http://m.rrqrq.com/showinfo-26-92-0.html三言兩語說透設計模式的藝術-單例模式

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 從 Pulsar Client 的原理到它的監控面板

下一篇: 分布式系統中的CAP理論,面試必問,你理解了嘛?

標簽:
  • 熱門焦點
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
国产日韩精品视频一区二区三区| 中文字幕在线不卡国产视频| 久久久久久久精| 一区二区三区在线视频观看| 日韩电影免费在线看| 99re热这里只有精品视频| 国产精品久久久久久模特 | 国产一区二区三区黄视频 | 久久国产人妖系列| 欧美阿v一级看视频| 在线视频你懂得一区| 国产亚洲欧美日韩俺去了| 日韩高清欧美激情| 欧美人与禽猛交乱配| 欧美三级电影网| 自拍av一区二区三区| 国产河南妇女毛片精品久久久| 日韩视频精品在线观看| 欧美videofree性高清杂交| 亚洲不卡av一区二区三区| 欧美在线免费一级片| 欧美午夜视频网站| 亚洲女人****多毛耸耸8| 高清成人在线观看| 久久精品国产综合精品| 国产精品久久久久久久蜜臀| 国产乱人伦精品一区二区在线观看| 日韩亚洲国产精品| 久久久综合视频| 国产jizzjizz一区二区| 狼狼综合久久久久综合网| 亚洲欧洲日产国码二区| aaa欧美大片| 69p69国产精品| 蜜桃视频免费观看一区| 国产精品一区视频| 亚洲欧美一区二区在线观看| 99re热视频这里只精品| 欧美一级高清片| 精品系列免费在线观看| 久久久久网站| 亚洲v日本v欧美v久久精品| 黄色欧美成人| 国产精品国产三级国产| 99久久综合色| 久久亚洲综合色| 成人性生交大片免费看视频在线 | 欧美另类视频| 国产日韩欧美a| 97精品视频在线观看自产线路二| 日韩视频免费观看高清完整版在线观看| 秋霞av亚洲一区二区三| 久久一区二区三区av| 亚洲国产一区二区视频| 亚洲欧美日韩国产综合精品二区| 亚洲区小说区图片区qvod| 亚洲国产精品一区制服丝袜| 中文字幕第一区综合| 午夜久久黄色| 国产清纯白嫩初高生在线观看91| 91网址在线看| 欧美激情一区在线观看| 亚洲欧美一级二级三级| 国产日韩欧美a| 精品福利av| 亚洲一区二区视频| 久久久久高清| 九九九久久久精品| 欧美一级二级三级蜜桃| 国产成人在线视频网站| 欧美成va人片在线观看| jizzjizzjizz欧美| 国产女主播一区| 国产视频一区在线观看一区免费| 亚洲综合久久久| 在线观看欧美精品| 国产99久久久久久免费看农村| 欧美zozo另类异族| 国产在线一区二区三区四区| 亚洲美腿欧美偷拍| 久久久水蜜桃av免费网站| 欧美视频1区| 国产精品久久国产精麻豆99网站| 9色国产精品| 日韩在线卡一卡二| 日韩限制级电影在线观看| 99视频在线精品| 亚洲免费三区一区二区| 麻豆成人精品| 国产凹凸在线观看一区二区| 国产香蕉久久精品综合网| 亚洲精品欧洲| 久久成人18免费观看| 26uuu亚洲| 国产三区二区一区久久| 极品少妇xxxx精品少妇偷拍| 久久久精品免费免费| 一本一本久久| 国产精品一色哟哟哟| 国产精品美女久久久久久久| 久久av最新网址| 不卡的av网站| 亚洲国产精品久久不卡毛片| 91精品国产综合久久精品麻豆| 欧美一区二区在线| 日韩国产欧美在线播放| 久久久久国产免费免费| 免费国产自线拍一欧美视频| 国产jizzjizz一区二区| 伊人夜夜躁av伊人久久| 欧美日韩www| 136国产福利精品导航网址| 久久国产尿小便嘘嘘| 中文字幕永久在线不卡| 欧美日韩极品在线观看一区| 国产精品二区在线观看| 美国毛片一区二区| 国产精品传媒入口麻豆| 欧美高清视频一二三区| 在线视频精品| 91啦中文在线观看| 久久精品国产网站| 亚洲乱码中文字幕综合| 精品美女一区二区三区| 日本伦理一区二区| 伊伊综合在线| 成人黄页在线观看| 麻豆精品久久久| 一区二区三区高清在线| 精品999久久久| 欧美日韩亚洲不卡| 中文精品在线| 国产在线视频欧美一区二区三区| 国产乱色国产精品免费视频| 一区二区不卡在线播放| 国产日韩欧美综合一区| 欧美一区二区大片| 欧美最猛黑人xxxxx猛交| 夜夜嗨网站十八久久 | 亚洲黄色免费网站| 欧美激情在线看| 久久综合色播五月| 欧美精品xxxxbbbb| 色婷婷国产精品| 日韩亚洲视频在线| 狠狠色狠狠色综合人人| 91一区一区三区| 国产福利91精品一区二区三区| 三级欧美韩日大片在线看| 日韩伦理免费电影| 亚洲国产成人私人影院tom| 欧美放荡的少妇| 欧美日韩你懂的| 欧美亚洲日本一区| 在线观看国产日韩| 久久综合九色综合网站| 另类av一区二区| 国产精品久久久久久久久久妞妞 | 毛片av一区二区三区| 丝袜美腿亚洲色图| 亚洲午夜免费福利视频| 亚洲欧洲日本mm| 亚洲电影一级片| 亚洲一级电影视频| 亚洲码国产岛国毛片在线| 国产精品毛片久久久久久| 国产女主播在线一区二区| 国产女人水真多18毛片18精品视频| 精品乱码亚洲一区二区不卡| 欧美一级高清片| 欧美一区二区三区在线| 欧美一级二级三级乱码| 日韩久久久久久| 久久久噜噜噜久久中文字幕色伊伊 | 久久精品人人做人人综合| 精品国产乱码久久久久久1区2区| 日韩欧美在线网站| 精品国产乱码久久久久久1区2区| 久久色在线视频| 国产精品久久久久久久久免费相片 | 亚洲欧美视频| 日本韩国精品一区二区在线观看| 一本久久综合亚洲鲁鲁五月天| 色婷婷综合久久久久中文| 日本高清成人免费播放| 欧美日韩精品福利| 日韩免费观看高清完整版| 久久久无码精品亚洲日韩按摩| 国产日本欧洲亚洲| 亚洲天堂中文字幕| 五月综合激情网| 国内不卡的二区三区中文字幕| 国产iv一区二区三区| 欧美在线黄色| 午夜亚洲一区| 欧美一级久久久| 中文字幕一区二区三区不卡在线| 亚洲国产精品麻豆| 精品写真视频在线观看| 91同城在线观看|