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

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

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

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

寫在前面

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

單例模式

單例模式的實現(xiàn)思路是:Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

單例模式的要點:Hoi28資訊網(wǎng)——每日最新資訊28at.com

  • 某個類只能有一個實例
  • 它必須自行創(chuàng)建實例
  • 它必須自行向整個系統(tǒng)提供整個實例

我們來看一下使用TypeScript實現(xiàn)單例模式的代碼示例:Hoi28資訊網(wǎng)——每日最新資訊28at.com

class Singleton {  // 私有靜態(tài)屬性,存儲唯一實例  private static instance: Singleton;  // 私有構造函數(shù),防止外部實例化  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類的構造函數(shù)被private修飾,使其無法在類的外部通過new來創(chuàng)建實例。Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

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

圖片圖片Hoi28資訊網(wǎng)——每日最新資訊28at.com

單例模式的優(yōu)點:Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

單例模式的缺點:Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

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

餓漢式單例類

餓漢式單例類:當類被加載時,靜態(tài)屬性instance會被初始化,此時類的私有構造函數(shù)會被調(diào)用,單例類的唯一實例將會被創(chuàng)建。Hoi28資訊網(wǎng)——每日最新資訊28at.com

普通單例模式和餓漢式單例模式的區(qū)別:Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

下面我們使用TypeScript代碼實現(xiàn)一個餓漢式單例:Hoi28資訊網(wǎng)——每日最新資訊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

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

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

懶漢式單例模式

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

懶漢式單例模式實現(xiàn)代碼如下:Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

但是,這種實現(xiàn)方式存在一個問題,就是在多線程環(huán)境下會存在安全隱患。Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

在實際開發(fā)中,我們可以根據(jù)需求選擇合適的實現(xiàn)方式,也可以采用雙重校驗鎖等線程安全的懶漢式實現(xiàn)。Hoi28資訊網(wǎng)——每日最新資訊28at.com

一種更好的單例實現(xiàn)方式

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

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

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

這樣通過IoC容器管理單例的創(chuàng)建,可以實現(xiàn):Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

總結

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

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

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

Hoi28資訊網(wǎng)——每日最新資訊28at.com

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

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

上一篇: 從 Pulsar Client 的原理到它的監(jiān)控面板

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

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产日韩在线一区| 国产精品日本| 欧美国产一区二区| 欧美三级免费| 国产一区二区日韩精品| 蜜桃久久av| 欧美日韩和欧美的一区二区| 国产精品一区二区男女羞羞无遮挡| 国产一区在线免费观看| 亚洲激情黄色| 亚洲综合色婷婷| 欧美 日韩 国产一区二区在线视频 | 亚洲女人小视频在线观看| 久久岛国电影| 欧美日韩一区成人| 韩国av一区| 亚洲少妇最新在线视频| 久久深夜福利免费观看| 欧美天天综合网| 精品99一区二区| 亚洲自拍偷拍麻豆| 欧美国产日本在线| 国产一区二区成人久久免费影院| 日韩一级裸体免费视频| 久久久久久久综合色一本| 欧美色图五月天| 亚洲高清视频一区二区| 午夜精品视频| 欧美日韩系列| 最新国产精品拍自在线播放| 欧美在线亚洲| 国产精品久久久久一区二区三区| 亚洲国产日韩欧美| 久久精品盗摄| 国产精品久久久久影院色老大 | 欧美在线一二三区| 欧美特黄a级高清免费大片a级| 一区二区亚洲精品| 午夜久久黄色| 欧美性猛交一区二区三区精品| 在线国产亚洲欧美| 香蕉成人久久| 国产精品久久99| 一本色道久久| 欧美经典一区二区三区| 在线播放日韩专区| 久久精品国产99精品国产亚洲性色| 欧美天堂亚洲电影院在线播放| 亚洲激情一区二区| 久久欧美中文字幕| 国产情侣久久| 午夜精品久久久久久久蜜桃app | 国产精品国产三级国产aⅴ无密码| 欧美激情综合五月色丁香| 黄色国产精品一区二区三区| 亚洲欧美日韩视频二区| 欧美日韩视频在线一区二区| 亚洲国产日韩欧美综合久久| 久久国产乱子精品免费女 | 欧美日韩精品系列| 亚洲国产小视频在线观看| 久久露脸国产精品| 国产在线精品成人一区二区三区| 午夜电影亚洲| 国产精品夜夜嗨| 亚洲欧美精品伊人久久| 欧美网站在线观看| 一区二区三区高清在线观看| 欧美日韩国产综合视频在线观看| 亚洲精品一区久久久久久| 欧美成熟视频| 亚洲国产精品久久久久秋霞影院 | 国产精品wwwwww| 中文在线一区| 欧美视频在线观看免费网址| 一本色道久久99精品综合| 欧美日韩国产首页在线观看| 99精品欧美一区| 欧美三区在线观看| 夜夜爽www精品| 欧美性大战久久久久久久蜜臀| 亚洲网站在线| 国产精品日韩久久久| 新67194成人永久网站| 国产欧美一区视频| 久久精品99久久香蕉国产色戒| 国产一区二区三区电影在线观看 | 久久久久久亚洲精品不卡4k岛国| 韩国福利一区| 猛干欧美女孩| 日韩网站在线| 国产精品久久久久永久免费观看| 午夜精品福利一区二区蜜股av| 国产日本欧美在线观看| 久久久久久婷| 亚洲激情中文1区| 欧美日韩国产一区| 亚洲一区免费观看| 国产日韩精品一区二区浪潮av| 久久国产精品99精品国产| 伊人伊人伊人久久| 欧美久久成人| 午夜影院日韩| 在线观看欧美日韩| 欧美日韩高清在线一区| 亚洲欧美日韩成人高清在线一区| 国产一区二区精品久久| 免费日本视频一区| 国产精品成av人在线视午夜片| 亚洲自拍另类| 国内外成人在线| 欧美黄色大片网站| 亚洲尤物在线视频观看| 国内精品久久久久久久影视蜜臀| 免费欧美视频| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 欧美自拍偷拍午夜视频| 精品不卡视频| 欧美精品成人91久久久久久久| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美一区国产二区| 亚洲国产天堂久久国产91| 欧美三级视频在线| 久久久91精品国产一区二区精品| 亚洲激情啪啪| 国产欧美精品| 免费h精品视频在线播放| 宅男噜噜噜66一区二区| 国内久久视频| 欧美日韩一区三区| 久久久久久夜| 亚洲影院在线| 亚洲激情婷婷| 国产亚洲成av人在线观看导航| 欧美大胆成人| 欧美一区二视频| 99这里只有精品| 韩国av一区二区| 欧美日韩在线精品| 亚洲精品乱码久久久久久久久 | 亚洲伦理在线观看| 国产亚洲毛片在线| 欧美日韩国产一中文字不卡| 欧美主播一区二区三区| 99这里只有久久精品视频| 国内精品久久久久影院色| 欧美人与性动交cc0o| 久久久久久久综合| 亚洲一区二区在线视频| 亚洲欧洲日韩综合二区| 国产综合视频在线观看| 国产精品夫妻自拍| 欧美激情免费在线| 久久久久久久成人| 亚洲欧美成人综合| 99精品99久久久久久宅男| 一区二区三区在线免费视频| 国产精品久久久久久久久免费| 免费的成人av| 久久久99精品免费观看不卡| 亚洲四色影视在线观看| 91久久精品一区二区三区| 国产一区二区三区日韩| 国产精品vip| 欧美激情精品久久久| 久久久久久久综合色一本| 亚洲欧美日韩精品久久亚洲区| 日韩午夜精品视频| 亚洲大片av| 红桃av永久久久| 国产麻豆日韩| 国产精品萝li| 欧美性色视频在线| 欧美精品三级| 欧美不卡视频一区发布| 久久久久久9| 欧美在线视屏| 午夜日韩在线观看| 亚洲一区二区三区在线| 一本久久综合亚洲鲁鲁五月天| 亚洲欧洲一区二区天堂久久| 永久域名在线精品| 国产一区在线观看视频| 国产日韩欧美在线视频观看| 国产精品女主播在线观看| 欧美日一区二区三区在线观看国产免| 欧美高清你懂得| 欧美成人中文| 99视频精品免费观看| 亚洲国产精品电影在线观看| 国产在线视频不卡二| 国产午夜亚洲精品羞羞网站| 国产精品久久久久久久午夜 | 免费影视亚洲| 免费看黄裸体一级大秀欧美| 久久久久国产一区二区三区四区 | 欧美91福利在线观看| 免费国产一区二区| 欧美成人中文字幕| 欧美成人精精品一区二区频| 女女同性女同一区二区三区91| 欧美成人精品在线观看| 欧美1区2区| 欧美日本一区|