佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > .Net 單例模式(Singleton)

.Net 單例模式(Singleton)

熱門標(biāo)簽:客戶服務(wù) 百度AI接口 科大訊飛語音識(shí)別系統(tǒng) 電商新玩法 人工智能 國(guó)美全國(guó)運(yùn)營(yíng)中心 網(wǎng)站排名優(yōu)化 電銷業(yè)務(wù)
每臺(tái)計(jì)算機(jī)可以有若干個(gè)打印機(jī),但只能有一個(gè)Printer Spooler, 以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)中。每臺(tái)計(jì)算機(jī)可以有若干傳真卡,但是只應(yīng)該有一個(gè)軟件負(fù)責(zé)管理傳真卡,以避免出現(xiàn)兩份傳真作業(yè)同時(shí)傳到傳真卡中的情況。每臺(tái)計(jì)算機(jī)可以有若干通信端口,系統(tǒng)應(yīng)當(dāng)集中管理這些通信端口,以避免一個(gè)通信端口同時(shí)被兩個(gè)請(qǐng)求同時(shí)調(diào)用。

問題描述:

        單例模式 Singleton Pattern

問題解決:

(1)單例模式簡(jiǎn)介:

Singleton模式要求一個(gè)類有且僅有一個(gè)實(shí)例,并且提供了一個(gè)全局的訪問點(diǎn)。這就提出了一個(gè)問題:如何繞過常規(guī)的構(gòu)造器,提供一種機(jī)制來保證一個(gè)類只有一個(gè)實(shí)例?客戶程序在調(diào)用某一個(gè)類時(shí),它是不會(huì)考慮這個(gè)類是否只能有一個(gè)實(shí)例等問題的,所以,這應(yīng)該是類設(shè)計(jì)者的責(zé)任,而不是類使用者的責(zé)任。

單例模式特點(diǎn):

    (1.1)一個(gè)類有且僅有一個(gè)實(shí)例

    (1.2)類提供一個(gè)全局的訪問點(diǎn)

        (2)單例模式的實(shí)現(xiàn):

(2.1)簡(jiǎn)單實(shí)現(xiàn):

上述實(shí)現(xiàn)的優(yōu)點(diǎn):

          (1)直到對(duì)象要求時(shí),才進(jìn)行實(shí)例的初始化,這種實(shí)現(xiàn)方法稱為:“惰性實(shí)例化”,惰性實(shí)例化,避免了程序啟動(dòng)時(shí)創(chuàng)建不必要的Singleton。

上述實(shí)現(xiàn)的缺點(diǎn):

           (1)這種實(shí)現(xiàn)對(duì)于多線程環(huán)境并不安全,可能實(shí)例化多個(gè)對(duì)象,例如可能存在兩個(gè)線程進(jìn)行instance==null的判斷,然后創(chuàng)建兩個(gè)單例對(duì)象,這就違背了單例模式的設(shè)計(jì)意圖。

    (2.2)安全的線程:

以上的實(shí)現(xiàn)保證了單例對(duì)象在多線程的情況下只會(huì)創(chuàng)建一個(gè),但是padlock增加了額外的開銷

    (2.3)雙重鎖定

        這種實(shí)現(xiàn)方式對(duì)多線程來說是安全的,同時(shí)線程不是每次都加鎖,只有判斷對(duì)象實(shí)例沒有被創(chuàng)建時(shí)它才加鎖,有了我們上面第一部分的里面的分析,我們知道,加鎖后還得再進(jìn)行對(duì)象是否已被創(chuàng)建的判斷。它解決了線程并發(fā)問題,同時(shí)避免在獲取 Instance 的調(diào)用中都出現(xiàn)獨(dú)占鎖定。它還允許您將實(shí)例化延遲到第一次訪問對(duì)象時(shí)發(fā)生。實(shí)際上,應(yīng)用程序很少需要這種類型的實(shí)現(xiàn)。大多數(shù)情況下我們會(huì)用靜態(tài)初始化。這種方式仍然有很多缺點(diǎn):無法實(shí)現(xiàn)延遲初始化。

(2.4)靜態(tài)初始化

        此實(shí)現(xiàn)中,將在第一次引用類的任何成員創(chuàng)建實(shí)例,該類標(biāo)記為 sealed 以阻止發(fā)生派生,而派生可能會(huì)增加實(shí)例。此外,變量標(biāo)記為 readonly,這意味著只能在靜態(tài)初始化期間(此處顯示的示例)或在類構(gòu)造函數(shù)中分配變量。它仍然可以用來解決 Singleton 模式試圖解決的兩個(gè)基本問題:全局訪問和實(shí)例化控制。公共靜態(tài)屬性為訪問實(shí)例提供了一個(gè)全局訪問點(diǎn)。此外,由于構(gòu)造函數(shù)是私有的,因此不能在類本身以外實(shí)例化 Singleton 類;因此,變量引用的是可以在系統(tǒng)中存在的唯一的實(shí)例。

由于 Singleton 實(shí)例被私有靜態(tài)成員變量引用,因此在類首次被對(duì) Instance 屬性的調(diào)用所引用之前,不會(huì)發(fā)生實(shí)例化。這種方法唯一的潛在缺點(diǎn)是,您對(duì)實(shí)例化機(jī)制的控制權(quán)較少。在 Design Patterns 形式中,您能夠在實(shí)例化之前使用非默認(rèn)的構(gòu)造函數(shù)或執(zhí)行其他任務(wù)。由于在此解決方案中由 .NET Framework 負(fù)責(zé)執(zhí)行初始化,因此您沒有這些選項(xiàng)。在大多數(shù)情況下,靜態(tài)初始化是在 .NET 中實(shí)現(xiàn) Singleton 的首選方法。

     (2.5)延遲初始化:

        (3)單例模式的優(yōu)缺點(diǎn):

        (4)單例模式適用情況和應(yīng)用場(chǎng)景:

        (5)具體實(shí)例:

總結(jié):

        Singleton設(shè)計(jì)模式是一個(gè)非常有用的機(jī)制,可用于在面向?qū)ο蟮膽?yīng)用程序中提供單個(gè)訪問點(diǎn)。

您可能感興趣的文章:
  • 五種單件模式之Singleton的實(shí)現(xiàn)方法詳解
  • 基于靜態(tài)Singleton模式的使用介紹
  • C#多線程Singleton(單件)模式模板
  • php設(shè)計(jì)模式 Singleton(單例模式)
  • javascript 單例/單體模式(Singleton)
  • .NET c# 單體模式(Singleton)
  • Python設(shè)計(jì)模式之單例模式實(shí)例
  • Python設(shè)計(jì)模式之觀察者模式實(shí)例
  • Python設(shè)計(jì)模式之代理模式實(shí)例
  • python中g(shù)etattr函數(shù)使用方法 getattr實(shí)現(xiàn)工廠模式
  • Windows 配置Apache以便在瀏覽器中運(yùn)行Python script的CGI模式
  • Python下singleton模式的實(shí)現(xiàn)方法

標(biāo)簽:益陽 拉薩 棗莊 攀枝花 南平 廈門 POS機(jī) 咸寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《.Net 單例模式(Singleton)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    渝中区| 临邑县| 耒阳市| 腾冲县| 红河县| 丰镇市| 宜丰县| 十堰市| 西宁市| 广饶县| 通州市| 静安区| 府谷县| 邓州市| 利川市| 涞源县| 来宾市| 墨玉县| 团风县| 滦南县| 江孜县| 鲜城| 荔浦县| 宿州市| 盈江县| 玛沁县| 沙湾县| 德化县| 枝江市| 保康县| 安陆市| 田东县| 孝义市| 泰兴市| 贡嘎县| 兴义市| 阜新市| 佛冈县| 绍兴市| 清涧县| 金华市|