在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,這就夠了。將它拷貝到第乙個...