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

【設(shè)計模式】單例模式|最常用的設(shè)計模式

這篇具有很好參考價值的文章主要介紹了【設(shè)計模式】單例模式|最常用的設(shè)計模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

寫在前面

單例模式是最常用的設(shè)計模式之一,雖然簡單,但是還是有一些小坑點需要注意。本文介紹單例模式并使用go語言實現(xiàn)一遍單例模式。

單例模式介紹

簡介

單例模式保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

使用場景:

  1. 當(dāng)類只能有一個實例而且可以從一個公開的眾所周知的訪問點訪問它。
  2. 當(dāng)這個唯一實例是通過子類化可擴展的,并且應(yīng)該無須更改單例代碼就能使用一個擴展的實例。

結(jié)構(gòu)圖
【設(shè)計模式】單例模式|最常用的設(shè)計模式,遇見Golang,擁抱未來,設(shè)計模式,單例模式

分類

單例里面分成了兩種模式,一種是餓漢式,一種是懶漢式。

餓漢式

餓漢模式下的單例,只在使用實例的時候就創(chuàng)建了對象。
代碼實例:

var req *Request

type Request struct {
}

func NewRequest() *Request {
	if req == nil {
		req = new(Request)
	}
	return req
}

這個代碼看起來沒什么問題,但是這段代碼是線程不安全的。 因為如果有多個請求過來,就會同時創(chuàng)建多個對象,就會出現(xiàn)頻繁的創(chuàng)建和刪除對象,給gc造成很大的壓力。

當(dāng)然我們也可以加鎖,但是頻繁的加鎖,解鎖會嚴(yán)重影響系統(tǒng)的性能。

var req *Request
var lock sync.Mutex

type Request struct {
}

func NewRequest() *Request {
	lock.Lock()
	defer lock.Unlock()
	if req == nil {
		req = new(Request)
	}
	return req
}

每一個對象的創(chuàng)建,都需要加鎖解鎖,非常影響性能

懶漢式

懶漢式的單例模式可以解決我們餓漢式的缺點,并且是線程安全的,保證了我們對象全局唯一并且不會重復(fù)創(chuàng)建。

代碼如下:

var req *Request
var reqOnce sync.Once

type Request struct {
}

func NewRequest() *Request {
	reqOnce.Do(func() {
		req = &Request{}
	})

	return req
}

這里我們用到go語言的 sync.Once 包,而sync.Once的作用就是使得我們的函數(shù)只執(zhí)行一次。并且是并發(fā)安全的。

那為什么是并發(fā)安全的呢?接下來我們詳解一下 sync.Once

sync.Once

sync.once 內(nèi)部原理很簡單,Once的結(jié)構(gòu)題如下:

type Once struct {
    // done變量用來標(biāo)識函數(shù)是否執(zhí)行完畢
    done uint32
    // m用來保證函數(shù)執(zhí)行期間,其他goroutine阻塞
    m    Mutex
}

這個Do方法是判斷有無執(zhí)行過這個該方法,并且是使用atomic.LoadUint32的原子操作。

func (o *Once) Do(f func()) {
    // 1.判斷函數(shù)是否執(zhí)行過,done=0說明沒執(zhí)行過
    if atomic.LoadUint32(&o.done) == 0 {
        o.doSlow(f)
    }
}
  1. 如果沒執(zhí)行過就執(zhí)行這個方法,那么這里會有一個double check的工作,其實就是防止可能在上一次檢查到這一次加鎖加完的時間段間隙上有人執(zhí)行完了這個函數(shù)

  2. 確認(rèn)確實沒有執(zhí)行的時候,就執(zhí)行函數(shù),并進(jìn)行原子操作標(biāo)識,將 done 置為1。

func (o *Once) doSlow(f func()) {
    // 1.加鎖
    o.m.Lock()
    // 5.函數(shù)返回后,釋放鎖
    defer o.m.Unlock()
    // 2.判斷是否執(zhí)行過
    if o.done == 0 {
        // 4.函數(shù)返回后,設(shè)置執(zhí)行標(biāo)識
        defer atomic.StoreUint32(&o.done, 1)
        // 3.具體執(zhí)行函數(shù)
        f()
    }
}

應(yīng)用場景舉例子

我們可以在 service 上定義某一個方法的結(jié)構(gòu)體函數(shù),并將可以根據(jù)這個結(jié)構(gòu)體函數(shù)進(jìn)行方法的擴展。
【設(shè)計模式】單例模式|最常用的設(shè)計模式,遇見Golang,擁抱未來,設(shè)計模式,單例模式
在controll層只需要調(diào)用這個函數(shù)方法即可GetUserSrv()文章來源地址http://www.zghlxwxcb.cn/news/detail-861684.html

到了這里,關(guān)于【設(shè)計模式】單例模式|最常用的設(shè)計模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 設(shè)計模式學(xué)習(xí)(一)單例模式補充——單例模式析構(gòu)

    設(shè)計模式學(xué)習(xí)(一)單例模式補充——單例模式析構(gòu)

    目錄 前言 無法調(diào)用析構(gòu)函數(shù)的原因 改進(jìn)方法 內(nèi)嵌回收類 智能指針 局部靜態(tài)變量 參考文章 在《單例模式學(xué)習(xí)》中提到了,在單例對象是通過 new 動態(tài)分配在堆上的情況下,當(dāng)程序退出時,不會通過C++的RAII機制自動調(diào)用其析構(gòu)函數(shù)。本文討論一下這種現(xiàn)象的原因以及

    2024年03月19日
    瀏覽(33)
  • 設(shè)計模式之單例設(shè)計模式

    就是一個類只允許創(chuàng)建一個對象,那么我們稱該類為單例類,這種設(shè)計模式我們稱為單例模式。 資源共享:有些類擁有共享的資源,例如數(shù)據(jù)庫連接池、線程池、緩存等。使用單例模式確保只有一個實例,避免資源浪費和競爭條件。 線程安全:單例模式可以用來保證多線程

    2024年02月07日
    瀏覽(29)
  • 設(shè)計模式 ~ 單例模式

    單例模式:指在確保一個類只有一個實例,創(chuàng)建之后緩存以便繼續(xù)使用,并提供一個全局訪問點來訪問該實例; 前端對于單例模式不常用,但對于單例的思想無處不在; 如:彈窗、遮罩層、登錄框、vuex redux 中的 store; 閉包: 模塊化:

    2024年02月16日
    瀏覽(38)
  • 設(shè)計模式(單例模式)

    ????????保證指定的類只有一個實例,不能創(chuàng)建出其他的實例 ? ? ? ? ? ? ? ? 1.1 代碼展示 ? ? ? ? ? ? ? ? 1.2 Singleton類中instance對象的創(chuàng)建時機 ????????????????Singleton類中instance對象的創(chuàng)建時機:在Singleton類被jvm加載的時候創(chuàng)建,Singleton類會在第一次使用的時

    2024年02月15日
    瀏覽(28)
  • 設(shè)計模式-單例模式

    ? ? ? 單例模式(Singleton Pattern)是設(shè)計模式中最簡單且最常用的一種創(chuàng)建型模式,其目的是保證一個類在整個系統(tǒng)中只存在一個實例,并提供全局訪問點來獲取這個唯一實例。這種模式主要適用于那些需要頻繁實例化然后又希望避免因為多次實例化而消耗過多資源或產(chǎn)生副

    2024年01月17日
    瀏覽(25)
  • 設(shè)計模式——單例模式

    設(shè)計模式——單例模式

    確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。 即保證一個類只有一個實例,并且提供一個全局訪問點 優(yōu)點 單例對象在內(nèi)存中只有一個實例,減少了內(nèi)存的開支。尤其對于一個頻繁創(chuàng)建、銷毀的對象時,單例模式的優(yōu)勢就更明顯。 減少系統(tǒng)的性能

    2024年02月16日
    瀏覽(34)
  • 【設(shè)計模式-單例模式】

    【設(shè)計模式-單例模式】

    在一個項目中的全局范圍內(nèi), 一個類 有且僅有一個實例對象 。這個唯一的實例對象給其他模塊提供數(shù)據(jù)的 全局訪問 。這樣的模式就叫 單例模式 。 單例模式的典型例子就是任務(wù)隊列。 首先, 考慮單例模式的要求為有且僅有一個實例對象。那么就先從構(gòu)造函數(shù)入手。類的構(gòu)

    2024年02月13日
    瀏覽(30)
  • 設(shè)計模式一:單例模式

    1、單例模式的實現(xiàn)方式 2、spring中的單例實現(xiàn)方式 spring中的單例不是線程安全的,當(dāng)涉及到共享數(shù)據(jù)時需要記性多線程安全性的處理

    2024年02月20日
    瀏覽(19)
  • 設(shè)計模式_單例模式

    保證該類只有一個實例( static私有變量 ),并提供一個訪問的它的全部訪問點( getInstance() 方法 ),該單例可以被所有程序模塊共享. 1)此類不可被復(fù)制. 2)此類不可被公開構(gòu)造. 也就是說,在c++中,它的 構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值函數(shù) 不能被公開調(diào)用. 個人理解,“懶漢式”,那一定很

    2024年02月12日
    瀏覽(28)
  • 設(shè)計模式一(單例模式)

    主要思路:將構(gòu)造方法私有化,并對外提供一個static的方法來創(chuàng)建對象 缺點:一開始就創(chuàng)建對象,占用系統(tǒng)資源 單線程下不會出現(xiàn)問題,但多線程會會有并發(fā)問題,main方法的測試結(jié)果: 會發(fā)生同一時間創(chuàng)建了多個對象,所以出現(xiàn)了DCL雙重檢索 可以實現(xiàn)延遲實例化,并且是

    2024年01月23日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包