日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

寫在前面

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

單例模式

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

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

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

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

我們來看一下使用TypeScript實現單例模式的代碼示例:zrd28資訊網——每日最新資訊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來創建實例。zrd28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

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

餓漢式單例類

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

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

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

下面我們使用TypeScript代碼實現一個餓漢式單例:zrd28資訊網——每日最新資訊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

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

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

懶漢式單例模式

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

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

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

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

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

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

為了使懶漢式單例在多線程中也是安全的,我們可以對getInstance方法加鎖:zrd28資訊網——每日最新資訊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;  }}

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

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

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

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

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

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

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

一種更好的單例實現方式

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

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

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

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

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

總結

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 女孩租房開2小時空調用完100元電費引熱議:5級能耗惹不起 月薪過萬電費也交不起

    近日,江蘇蘇州一女孩租房當天充值了100元電費,開著空調不到2小時發現電費已用完。對于為什么這個快,房東表示,電表壞了這種情況很多,之前也遇到過,給租客換
  • CSS單標簽實現轉轉logo

    轉轉品牌升級后更新了全新的Logo,今天我們用純CSS來實現轉轉的新Logo,為了有一定的挑戰性,這里我們只使用一個標簽實現,將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 零售大模型“干中學”,攀爬數字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業路線有兩條,一是尼泊爾境內的南坡路線,一是中國境內的北坡路線。相
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業觀察編 | 肖海林今年以來,威士忌市場開始出現了降溫跡象,越來越多不斷暴漲的網紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁“充值中心”入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • 華為開發者大會2023日程公開:開設鴻蒙HarmonyOS 4體驗區

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發者大會 2023 的詳細日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發布最新一代鴻蒙 H
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品亚洲综合| 久久久国产亚洲精品| 亚洲激情精品| 99国产精品国产精品久久| 免费在线亚洲| 欧美精品成人| 欧美日韩中字| 国产一区二区三区免费不卡| 欧美激情第1页| 久久久av水蜜桃| 久久国产婷婷国产香蕉| 老司机精品视频一区二区三区| 欧美精品国产精品| 国产欧美日本一区视频| 亚洲国内自拍| 亚洲免费婷婷| 免费在线欧美黄色| 欧美色欧美亚洲另类二区| 欧美91大片| 国产精品99一区| 欲香欲色天天天综合和网| 一本一本a久久| 久久久精彩视频| 欧美激情精品久久久久久黑人| 国产精品婷婷| 亚洲欧洲一区二区三区久久| 亚洲五月六月| 牛牛影视久久网| 国产欧美日韩亚洲一区二区三区| 亚洲激情自拍| 欧美影院一区| 欧美午夜大胆人体| 亚洲精品一二| 久久久久久综合| 国产精品日产欧美久久久久| 亚洲日本一区二区三区| 久久高清福利视频| 欧美日韩综合一区| 亚洲国产精品一区二区www| 亚洲欧美中文另类| 欧美日韩精品免费观看| 欧美天堂在线观看| 影音先锋中文字幕一区二区| 亚洲一区三区视频在线观看| 欧美1区2区| 国产在线播精品第三| 亚洲一区二区三区精品动漫| 欧美高清视频免费观看| 国产专区欧美精品| 午夜在线播放视频欧美| 国产精品v欧美精品∨日韩| 亚洲精品国产无天堂网2021| 久久久久久成人| 国产欧美视频一区二区三区| 国产欧美精品日韩区二区麻豆天美| 亚洲欧洲日韩综合二区| 久久综合网色—综合色88| 国产日韩欧美日韩| 亚洲无线观看| 欧美日韩国产大片| 91久久中文字幕| 久久综合一区二区| 激情欧美一区二区三区在线观看| 亚洲欧美一区二区视频| 久久精品一二三| 国产精品区免费视频| 一区二区三欧美| 久久久久88色偷偷免费| 国产精品免费网站在线观看| 99视频国产精品免费观看| 欧美丰满少妇xxxbbb| 亚洲国产欧美不卡在线观看| 久久影院午夜论| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲国产国产亚洲一二三| 久久国产婷婷国产香蕉| 国产精品自在线| 亚洲在线不卡| 国产精品久久久一本精品| 亚洲免费福利视频| 欧美成人一区二区| 亚洲国产成人av在线| 老**午夜毛片一区二区三区| 黑人巨大精品欧美一区二区| 91久久久久久国产精品| 久久综合久久综合九色| 永久域名在线精品| 久久婷婷国产综合精品青草 | 国产免费成人| 亚洲综合色在线| 国产精品激情av在线播放| 亚洲一区免费网站| 国产精品推荐精品| 久久av老司机精品网站导航| 尤物精品在线| 久久精品成人欧美大片古装| 国产美女精品视频| 欧美一区二区三区在线免费观看| 国产欧美亚洲视频| 久久国产福利国产秒拍| 欧美精品一区二区三区蜜臀 | 亚洲精品免费观看| 欧美日本三区| 在线综合欧美| 国产精品萝li| 欧美在线视频不卡| 在线观看日韩www视频免费| 欧美国产一区二区在线观看| 一区二区三区四区五区精品| 国产精品视频xxxx| 久久久五月婷婷| 亚洲精选视频在线| 国产精品网曝门| 久久久一区二区三区| 国产欧美一区二区三区久久人妖| 欧美在线视频网站| 亚洲国产精品欧美一二99| 欧美日韩午夜视频在线观看| 午夜在线成人av| 在线欧美日韩| 欧美午夜精品理论片a级大开眼界| 香港久久久电影| **网站欧美大片在线观看| 欧美专区在线观看一区| 在线观看欧美亚洲| 欧美日韩另类一区| 久久国产日本精品| 亚洲精品午夜精品| 国产女主播视频一区二区| 麻豆亚洲精品| 亚洲一区不卡| 亚洲第一二三四五区| 欧美日韩另类丝袜其他| 国产精品yjizz| 99国产精品| 国产精品试看| 狂野欧美激情性xxxx| 亚洲靠逼com| 国产区精品视频| 欧美成人激情在线| 午夜精品亚洲| 亚洲欧洲另类国产综合| 国产精品久久久久久久久久三级| 在线中文字幕日韩| 国产一区二区三区在线观看网站 | 欧美日韩第一区| 久久国产精品99久久久久久老狼| 亚洲国产精品久久久久秋霞蜜臀| 欧美视频久久| 久久视频一区二区| 亚洲一区二区四区| 亚洲高清视频一区| 国产伦精品一区二区| 欧美啪啪一区| 久久野战av| 亚洲一区二区三区免费视频 | 亚洲国产精品嫩草影院| 国产欧美日韩视频一区二区| 欧美精品日本| 久久久国产午夜精品| 亚洲无线视频| 亚洲国产综合视频在线观看| 国产日韩久久| 国产精品对白刺激久久久| 欧美sm重口味系列视频在线观看| 欧美一区三区二区在线观看| 亚洲午夜av| 日韩一级视频免费观看在线| 亚洲夫妻自拍| 国模精品一区二区三区| 国产精品视频网站| 欧美日韩亚洲一区二区三区四区| 免费不卡在线视频| 久久精品视频va| 性欧美办公室18xxxxhd| 亚洲午夜精品久久久久久app| 亚洲精品国产精品国自产观看浪潮 | 欧美777四色影视在线| 久久精精品视频| 亚洲欧美在线免费| 一区二区三区免费网站| 亚洲精品系列| 亚洲人成网站999久久久综合| 一区二区在线视频播放| 国内精品视频一区| 国产三区精品| 国产日产欧美a一级在线| 国产精品捆绑调教| 国产精品啊啊啊| 久久精品亚洲一区二区三区浴池| 亚洲欧美精品一区| 亚洲在线黄色| 亚洲午夜国产成人av电影男同| 日韩视频在线一区二区| 亚洲日韩视频| 亚洲人成欧美中文字幕| 亚洲国产乱码最新视频| 亚洲高清在线精品| 欧美视频在线观看 亚洲欧| 一区二区三区视频免费在线观看 | 一区二区三区精密机械公司| 99国产麻豆精品| 99精品久久免费看蜜臀剧情介绍| 亚洲精选大片|