国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[設(shè)計(jì)模式]創(chuàng)建型模式-單例模式

這篇具有很好參考價(jià)值的文章主要介紹了[設(shè)計(jì)模式]創(chuàng)建型模式-單例模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

單例模式是最簡(jiǎn)單的一種模式。在Go中,單例模式指的是全局只有一個(gè)實(shí)例,并且它負(fù)責(zé)創(chuàng)建自己的對(duì)象。單例模式有減少內(nèi)存和系統(tǒng)資源開(kāi)銷、防止多個(gè)實(shí)例產(chǎn)生沖突等優(yōu)點(diǎn)。

因?yàn)閱卫J奖WC了實(shí)例的全局唯一性,并且只被初始化一次,所以比較適合全局共享一個(gè)實(shí)例,且只需要被初始化一次的場(chǎng)景,例如數(shù)據(jù)庫(kù)實(shí)例、全局配置、全局任務(wù)池等。

單例模式又分為餓漢方式和懶漢方式。餓漢方式是指全局的單例實(shí)例在包被加載時(shí)創(chuàng)建,而懶漢方式指全局的單例實(shí)例在第一次被使用時(shí)創(chuàng)建。其中懶漢方式是開(kāi)源項(xiàng)目中使用最多的方式。

示例代碼

Go

懶漢方式的缺點(diǎn)是非并發(fā)安全,實(shí)際使用中一般加鎖,或者使用sync.Once

package singleton  
  
import "sync"  
  
type Singleton interface {  
    foo()  
}  
  
type singleton struct{}  
  
func (s singleton) foo() {}  
  
var (  
    instance *singleton  
    once     sync.Once  
)  
  
func GetInstance() Singleton {  
    once.Do(func() {  
       instance = &singleton{}  
    })  
  
    return instance  
}

單元測(cè)試

package singleton  
  
import (  
    "sync"  
    "testing")  
  
const parCount = 100  
  
func TestSingleton(t *testing.T) {  
    ins1 := GetInstance()  
    ins2 := GetInstance()  
    if ins1 != ins2 {  
       t.Fatal("instance is not equal")  
    }  
}  
  
func TestParallelSingleton(t *testing.T) {  
    start := make(chan struct{})  
    wg := sync.WaitGroup{}  
    wg.Add(parCount)  
  
    instance := [parCount]Singleton{}  
    for i := 0; i < parCount; i++ {  
       go func(index int) {  
          <-start  
          instance[index] = GetInstance()  
          wg.Done()  
       }(i)  
    }  
    close(start)  
    wg.Wait()  
    for i := 1; i < parCount; i++ {  
       if instance[i] != instance[i-1] {  
          t.Fatal("instance is not equal")  
       }  
    }  
}

Python

python的包是天然的單例模式,只要放到單獨(dú)的包中,import時(shí)就是引用的單例。

如果要在一個(gè)包內(nèi)使用設(shè)計(jì)模式,也有以下幾種方式。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-825827.html

使用函數(shù)裝飾器實(shí)現(xiàn)單例

def singleton(cls):  
    _instance = {}  
  
    def inner():  
        if cls not in _instance:  
            _instance[cls] = cls()  
        return _instance[cls]  
  
    return inner  
  
  
@singleton  
class MyCls:  
    def __init__(self):  
        pass  
  
  
if __name__ == "__main__":  
    a = MyCls()  
    b = MyCls()  
    print(id(a) == id(b))  # 輸出結(jié)果應(yīng)為 True

使用類裝飾器實(shí)現(xiàn)單例

class Singleton:  
    def __init__(self, cls):  
        self._cls = cls  
        self._instance = {}  
  
    def __call__(self):  
        if self._cls not in self._instance:  
            self._instance[self._cls] = self._cls()  
        return self._instance[self._cls]  
  
  
@Singleton  
class MyCls:  
    def __init__(self):  
        pass  
  
  
if __name__ == "__main__":  
    a = MyCls()  
    b = MyCls()  
    print(id(a) == id(b))  # 輸出結(jié)果應(yīng)該是True

參考

  • 知乎 - Crossin - Python單例模式的N種實(shí)現(xiàn)

到了這里,關(guān)于[設(shè)計(jì)模式]創(chuàng)建型模式-單例模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 學(xué)習(xí)筆記-設(shè)計(jì)模式-創(chuàng)建型模式-單例模式

    一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)此實(shí)例的點(diǎn),哪怕多線程同時(shí)訪問(wèn)。 單例模式主要解決了 一個(gè)全局使用的類被頻繁的創(chuàng)建和消費(fèi) 的問(wèn)題。 單例模式的案例場(chǎng)景 數(shù)據(jù)庫(kù)的連接池不會(huì)反復(fù)創(chuàng)建 spring中一個(gè)單例模式bean的生成和使用 在我們平常的代碼中需要設(shè)置全局

    2024年02月08日
    瀏覽(18)
  • 【地鐵上的設(shè)計(jì)模式】--創(chuàng)建型模式:?jiǎn)卫J剑ㄎ澹?-枚舉單例

    什么是枚舉單例 枚舉單例是指使用枚舉類型來(lái)實(shí)現(xiàn)單例模式,它是單例模式中最簡(jiǎn)單、最安全的一種實(shí)現(xiàn)方式。在枚舉類型中定義的枚舉值只會(huì)被實(shí)例化一次,即保證了全局唯一的實(shí)例,而且實(shí)現(xiàn)簡(jiǎn)單、線程安全、防止反射攻擊、支持序列化等。 如何實(shí)現(xiàn)枚舉單例 實(shí)現(xiàn)枚舉

    2023年04月25日
    瀏覽(20)
  • 設(shè)計(jì)模式-創(chuàng)建型模式(單例、工廠、建造、原型)

    設(shè)計(jì)模式:軟件設(shè)計(jì)中普遍存在(反復(fù)出現(xiàn))的各種問(wèn)題,所提出的解決方案。 面向?qū)ο笕筇匦裕悍庋b、繼承、多態(tài)。 面向?qū)ο笤O(shè)計(jì)的SOLID原則: (1)開(kāi)放封閉原則:一個(gè)軟件實(shí)體如類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。即軟件實(shí)體應(yīng)盡量在不修改原有代碼的情

    2024年02月08日
    瀏覽(28)
  • c#設(shè)計(jì)模式-創(chuàng)建型模式 之 單例模式

    目錄 前言: 優(yōu)點(diǎn): 缺點(diǎn): 餓漢式(靜態(tài)變量方式) 懶漢式(線程不安全) 懶漢式(雙重檢查鎖定) 推薦方式Lazy 總結(jié): 這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類提供 了一種訪問(wèn)其唯一的對(duì)象的方式,可以直接訪問(wèn),

    2024年02月13日
    瀏覽(31)
  • GO設(shè)計(jì)模式——4、單例模式(創(chuàng)建型)

    目錄 單例模式(Singleton Pattern)?? 優(yōu)缺點(diǎn) 使用場(chǎng)景 餓漢式和懶漢式單例模式 ????????單例模式(Singleton Pattern)是一個(gè)類 只允許創(chuàng)建一個(gè) 對(duì)象(或者實(shí)例),那這個(gè)類就是一個(gè)單例類,這種設(shè)計(jì)模式就叫作單例設(shè)計(jì)模式,簡(jiǎn)稱單例模式。單例模式的要點(diǎn)有三個(gè):一是

    2024年02月05日
    瀏覽(24)
  • C++設(shè)計(jì)模式創(chuàng)建型之單例模式

    一、概述 ? ? ? ? 單例模式也稱單態(tài)模式,是一種創(chuàng)建型模式,用于創(chuàng)建只能產(chǎn)生一個(gè)對(duì)象實(shí)例的類。例如,項(xiàng)目中只存在一個(gè)聲音管理系統(tǒng)、一個(gè)配置系統(tǒng)、一個(gè)文件管理系統(tǒng)、一個(gè)日志系統(tǒng)等,甚至如果吧整個(gè)Windows操作系統(tǒng)看成一個(gè)項(xiàng)目,那么其中只存在一個(gè)任務(wù)管理

    2024年02月14日
    瀏覽(29)
  • 深入理解設(shè)計(jì)模式-創(chuàng)建型之單例模式

    如果有些數(shù)據(jù)在系統(tǒng)中應(yīng)該且只能保存一份,那就應(yīng)該設(shè)計(jì)為單例類。 如:配置類:在系統(tǒng)中,我們只有一個(gè)配置文件,當(dāng)配置文件被加載到內(nèi)存之后,應(yīng)該被映射為一個(gè)唯一的【配置實(shí)例】,此時(shí)就可以使用單例,當(dāng)然也可以不用。 全局計(jì)數(shù)器:我們使用一個(gè)全局的計(jì)數(shù)

    2024年02月12日
    瀏覽(24)
  • 【Java 設(shè)計(jì)模式】創(chuàng)建型之單例模式

    【Java 設(shè)計(jì)模式】創(chuàng)建型之單例模式

    在軟件開(kāi)發(fā)中,單例模式是一種常見(jiàn)的設(shè)計(jì)模式, 它確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn) 。單例模式在需要控制某些資源,如數(shù)據(jù)庫(kù)連接池、線程池等共享資源的情況下非常有用。在本文中,我們將介紹 Java 設(shè)計(jì)模式中的單例模式,了解其實(shí)現(xiàn)方式、使用場(chǎng)景

    2024年01月18日
    瀏覽(26)
  • Java23種設(shè)計(jì)模式-創(chuàng)建型模式之單例模式

    單例模式 (Singleton Pattern):通過(guò)單例模式的方法創(chuàng)建的 類在當(dāng)前進(jìn)程中只有一個(gè)實(shí)例 (根據(jù)需要,也有可能一個(gè)線程中屬于單例,如:僅線程上下文內(nèi)使用同一個(gè)實(shí)例),該類負(fù)責(zé) 創(chuàng)建自己的對(duì)象 ,同時(shí) 確保只有單個(gè)對(duì)象 被創(chuàng)建。 注 : 1、單例類 只能 有 一個(gè)實(shí)例 。

    2024年04月26日
    瀏覽(27)
  • 《golang設(shè)計(jì)模式》第一部分·創(chuàng)建型模式-01-單例模式(Singleton)

    《golang設(shè)計(jì)模式》第一部分·創(chuàng)建型模式-01-單例模式(Singleton)

    指目標(biāo)類(Class)只有一個(gè)實(shí)例對(duì)象(Object),并且向使用該對(duì)象的客戶端提供訪問(wèn)單例的全局方法。 保證類只有一個(gè)實(shí)例 有方法能讓外部訪問(wèn)到該實(shí)例 懶漢式 在第一次調(diào)用單例對(duì)象時(shí)創(chuàng)建該對(duì)象,這樣可以避免不必要的資源浪費(fèi) 餓漢式 在程序啟動(dòng)時(shí)就創(chuàng)建單例對(duì)象,這

    2024年02月14日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包