單例模式 她真的很簡單嗎?

2021-10-23 19:56:59 字數 3437 閱讀 2640

在23中設計模式中,單例模式可能是大家認為比較簡單的一種設計模式,然而筆者覺得單例模式非常的不簡單,而且是獨一無二,就像我們在數學中對於ex求導,無論求多少次導數,它都還是ex,多麼的堅定和唯一。似乎我們的愛情也應該像單例模式一樣,永遠都是純粹且專一的。願得一人心,白首不相離。

接下來就詳細介紹一下這神秘而又專情的單例模式。

官方定義:確保乙個單例類有且僅有乙個例項,並且提供乙個全域性的公共訪問點。

通俗釋義:也就是說這個單例類只能有乙個自己的例項,簡單點來說就是只能new出乙個物件,然後提供給全域性使用。

通用類圖

單例模式解決了什麼問題呢,簡單點說解決了兩個問題:

1.保證了乙個類只有乙個例項,就僅僅new出了乙個例項呀,與建構函式不一樣的是,建構函式是構造不同的例項物件。

2.為全域性提供了該例項的訪問節點,也就是說,大家都可以訪問,隨便訪問,我就是我,你再來還是我,就是一樣的煙火等著你。

那麼為什麼要有單例模式呢,到底什麼場景下會使用到單例模式呢?我們都知道,單例模式是全域性僅有乙個例項,所以非常的節省資源,並且某種情況下訪問速度也是非常的快,在需要這種公共資料的情況下,單例就能發揮其重要的作用。接下來列舉幾個實際工作中應用到的場景。

1.在資源共享的情況下,需要頻繁的建立銷毀資源,為了避免這種操作在效能上的損耗,就可以使用單例模式,例如:日誌檔案列印,應用配置使用。

2.在控制資源的情況下,如果頻繁的建立資源而沒有及時**的話,那麼可能會造成系統資源的浪費或者記憶體洩漏,那麼可以採用單例模式避免資源的過度使用便於資源的互相通訊。例如:資料庫連線池,執行緒池等。

不就是提供乙個單例嗎,不就是為全域性提供乙個公共訪問節點嗎,幹嘛還這麼多形式,到底想怎麼玩嘛。單例模式笑著說,這就是我不一樣的地方。

懶漢式

/**

* @author: max

* @description:懶漢式-執行緒不安全

*/public

class

singletonlh

//私有構造方法

//公共全域性訪問點

public

static singletonlh getinstance()

return instance;}}

/** * @author: max

* @date: 2020-08-25 22:33

* @description:懶漢式-執行緒安全

*/public

class

singletonlh

//私有構造方法

//公共全域性訪問點

public

static

synchronized singletonlh getinstance()

return instance;

}}

餓漢式

/**

* @author: max

* @description:餓漢式-天生執行緒安全

*/public

class

singletoneh

//私有構造器

//全域性公共訪問點

public

static singletoneh getinstance()

}

雙重檢查鎖

/**

* @author: max

* @description:雙重檢查鎖

*/public

class

singletondl

//私有構造方法

//公共全域性訪問點

public

static singletondl getinstance()

}}return instance;

}}

靜態內部類

/**

* @author: max

* @description:靜態內部類

*/public

class

singletonstatic

//全域性訪問點

public

static singletonstatic getinstance()

//靜態內部類

private

static

class

singleholder

}

以上的這些**,我想很多人都能在網上搜到或者自己能親手編寫的出來,我們真正要掌握的是單例模式的核心思想:全域性唯一。

通過上面的單例模式使用場景的介紹,我們可以知道介紹乙個模式的優缺點是比較有針對性性的,在某些條件或者場景下其具有不可替代的優點,但是拋開這些條件或者場景往往是並非適用。

優點

缺點

我們在實際開發當中其實很少用到單例模式,一般在進行框架開發或者基層工具類開發的時候才可能使用到。這裡就簡單提一下,主要給出相關線索,方便引導和查閱。

spring框架中的abstractfactorybean對於單例模式的經典應用。

public

abstract

class

abstractfactorybean

implements

factorybean

, beanclassloaderaware, beanfactoryaware, initializingbean, disposablebean

jdk的runtime類就使用到了單例模式中的餓漢式。

public

class

runtime

/** don't let anyone else instantiate this class */

private

runtime()

}

mybatis中的errorcontext也使用到了單例模式。

public

class

errorcontext

public

static errorcontext instance()

return context;

}}

經典使用其實非常多,我們要掌握這些實際的應用,就需要對於這些**設計在實際專案中的作用和原理進行剖析。

1.手寫乙個單例模式,並談一談對於單例模式的理解。

考察:單例模式的幾種寫法,執行緒安全對比,優缺點的考問。

2.單例模式在哪些地方有應用,工作中是否用到呢?

考察:單例模式的應用場景和在框架中的使用情況。

學好vue真的很簡單嗎

難和簡單都是相對的,尤大大當然覺得vue is so easy,乙個新手小白當然覺得vue是難的。如果你學不會,然後懷疑自己是不是太蠢,那就太不應該了。幾乎所有的文章都在說vue官方文件寫的好,vue比react angular難於上手,學習曲線沒那麼陡峭,雖然都說的實話,但是那都是對於乙個基礎良好...

01真的很簡單

dedecms的20位hash值,是32位的hash值去掉前面5位,去掉後面7位構成。同時,將20位的hash值,去掉前面3位,去掉後1位,就和相同密碼的16位hash值一樣,也就是說密碼為123456的32位hash值,按照上述方法得到的16位hash值與16位直接加密的hash值相同。解密為on...

sqlite快速入門手冊 真的很簡單

它的特點是 極小 資料庫 效能不錯。適合場景 小型應用軟體,解決存檔案的不便 windows開發環境下可以選擇 sqlite shell win32 x86 3080500.zip 294.87 kib 具體編號3080500可能會不同 解壓後只有個sqlite3.exe,這就夠了。將它拷貝到第乙個...