引子
最近看完了first head 設(shè)計(jì)模式,這本書,還是很不錯(cuò)的,除了個(gè)別的翻譯看起來不是很舒服,還有,個(gè)人覺得單例模式和裝飾模式寫的不是很好,不過這本書還是推薦大家去讀的.
那我們就從單例模式開始,我們把我看的這些設(shè)計(jì)模式都會(huì)寫出來.加上自己的一些見解,歡迎大家圍觀指正.
單例模式就是一個(gè)類只產(chǎn)生一個(gè)具體實(shí)例的對(duì)象.例如線程池對(duì)象,我們只需要一個(gè)就能夠管理其中所有的線程了,多幾個(gè)線程池對(duì)象完全沒有存在的必要.
還有緩存對(duì)象,一個(gè)系統(tǒng)中一個(gè)就夠了,多了反而不好去維護(hù)它.
單例的核心就是私有化構(gòu)造方法,同時(shí)提供一個(gè)public 方法,對(duì)外提供獲取對(duì)象的方法.
單例最簡(jiǎn)單的就是jdk1.5之后的枚舉類型了,同時(shí)effective java中推薦的獲取單例的方法.
枚舉的單例是直接相當(dāng)于直接創(chuàng)建了一個(gè)對(duì)象,沒有采用延遲加載的方法.
代碼如下:
public enum Single5 {
RED;
}
這就是的了,是不是很簡(jiǎn)單,哈哈.
再進(jìn)行延遲加載的懶漢式了.
我們首先考慮最簡(jiǎn)單的情況:
public class SingleOne {
private static SingleOne instance;//全局變量
private SingleOne(){};//私有化
public static SingleOne getInstance(){
if(instance==null){//第一次訪問沒有,就new了一個(gè)出來了
instance=new SingleOne();
}
return instance;
}
}
在第一次訪問的時(shí)候,會(huì)創(chuàng)建一個(gè)新的對(duì)象出來,以后再次獲取時(shí)候,直接獲取已經(jīng)產(chǎn)生的對(duì)象.
如果考慮在多線程時(shí)候的情況,就需要進(jìn)行同步的處理了.
對(duì)簡(jiǎn)單的就是在獲取的方法上進(jìn)行同步,
public class SingleOne {
private static SingleOne instance;//全局變量
private SingleOne(){};//私有化
public static ?synchronized SingleOne getInstance(){
if(instance==null){//第一次訪問沒有,就new了一個(gè)出來了
instance=new SingleOne();
}
return instance;
}
}
這種寫法獲取的效率會(huì)比較差,每次只能有一個(gè)線程獲取對(duì)象.可以對(duì)他進(jìn)行一點(diǎn)改進(jìn)
//提高了效率,先判斷
class Single4{
private static Single4 instance;
private Single4(){}
public static Single4 getInstance(){
if(instance==null){//首先進(jìn)行判斷,是否已經(jīng)產(chǎn)生了對(duì)象,沒有進(jìn)行同步保護(hù)
synchronized (new Object()){
if(instance==null){
instance=new Single4();
}
}
}
return instance; //這里直接返回對(duì)象
}
}
先進(jìn)行判斷,第一次創(chuàng)建對(duì)象時(shí)候進(jìn)行同步保護(hù),以后就可以隨便獲取了.
這就是延遲記載,具體是否使用延遲加載,看具體的需求和環(huán)境,由你自己決定,不用聽信別人的"權(quán)威",畢竟沒有什么事是一樣的.
再就是惡漢式了,直接在加載類的時(shí)候就創(chuàng)建一個(gè)對(duì)象出來,放在那里,以后直接獲取就行了.
//直接new一個(gè)出來
class Single2{
private static final Single2 instance =new Single2(); // static ?final
private Single2(){} //私有化
public static ?Single2 ?getInstance(){
return instance;
}
}
使用final 和static 來進(jìn)行修飾.
寫到這里就差不多了,關(guān)于私有化構(gòu)造方法再多說一句,一些工具類,都是提供的static 方法,完全可以私有化構(gòu)造方法,讓他們直接沒有辦法創(chuàng)建對(duì)象,杜絕了使用對(duì)象調(diào)用
static方法的可能.
剛才是這篇博客快寫完了,然后電腦直接死機(jī)了,這是寫的第二遍,寶寶心里苦啊...就這樣子.
https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-18045781879.2.33c5236bZlPDUM&id=569353717228
深入理解Java虛擬機(jī)(jvm性能調(diào)優(yōu)+內(nèi)存模型+虛擬機(jī)原理)? ?很不錯(cuò)的虛擬機(jī)視頻教程.