設計模式之單件模式

2021-06-21 19:06:22 字數 1620 閱讀 8823

有一些物件我們只需要乙個(也只能有乙個)比如:執行緒池、cache、對話方塊、處理偏好設定和登錄檔的物件、日誌物件、充當印表機、顯示卡等裝置的驅動程式的物件。

利用靜態類變數、靜態方法和適當的訪問修飾符,就可以做到只存在乙個例項。

這是乙個經典的單件模式:

public class singleton 

public static singleton getinstance()//靜態方法,引用要使用類名

}

單件模式確保乙個類只有乙個例項,並提供乙個全域性訪問點。

它比全域性變數多了乙個優點:延遲例項化。

乙個巧克力工廠具有計算機控制的巧克力鍋爐,只能存在乙個鍋爐,不然會有bad things 發生:

public class chocolateboiler 

public static chocolateboiler getinstance()

public void fill() }

public void drain()

public void boil()

public boolean isempty()

public boolean isboiled()

}

但是,當我們執行以下**時,就會發生麻煩,竟然允許在加熱的過層中加入原料:

chocolateboiler boiler=chocolateboiler.getinstance();

fill();

boil();

drain();

這裡有兩個執行緒要執行這段**,我們檢查getinstance()方法中的操作次序和uniqueinstance的值就會發現,它們重疊了,產生了兩個鍋爐物件。

處理多執行緒,只要把getinstance()方法變成同步方法,可以解決:

public static synchronized chocolateboiler getinstance()

但是同步會降低效能。。。

當getinstance()的效能對應用程式不是很關鍵,就什麼都別做。這是最直接可行的做法!

otherwise,使用急切建立例項,而不用延遲例項化的方法:

public class chocolateboiler 

public static chocolateboiler getinstance()

//...

}

載入這個類時馬上建立此唯一的單件例項。

還有一種更好的:雙重檢查加鎖

原理是這樣的,首先檢查是否例項已經被建立,如果尚未建立,才進行同步。這樣一來,只有第一次會同步!!!

public class chocolateboiler 

public static chocolateboiler getinstance()

} return uniqueinstance;

} //...

}

這個方法在對效能要求高的時候可以用,不然就是殺雞用牛刀了,呵呵。

設計模式之單件模式

總結性 1 和全域性變數不同的是 利用單件模式,可以在需要時才建立物件 2 作用 常用於管理共享資源,eg 資料庫連線池或者執行緒池 3 單件模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點 4 有點 單件可以延遲例項化 5 單件模式的類圖 類名 singleton 靜態變數 static un...

設計模式之單件模式

今天我們不舉實際的例子了,就直接開始討論單件模式吧,首先我們要明白什麼叫單件模式。單件模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。在寫程式的過程中,很多時候我們需要用到乙個全域性物件,很好,當我們需要使用全域性物件的時候我們的單件模式就排上用場了,廢話不多說,我們直接看 class sin...

設計模式之單件模式

有人說叫單例模式,可是這有什麼關係呢,叫什麼都可以。好了進入正題,這個非常簡單,就是把建構函式私有化,然後通過乙個靜態方法獲得物件例項 這年頭物件真不好找,都是私有化的 有乙個問題就是可能會多執行緒的時候,導致例項化多次,解決這個問題的方法有三種 1 同步方法,簡單快捷,但是效能較差 public ...