Java设计模式——单件模式
概述
? 有一些對象其實我們只需要一個,比方說:線程池(threadpool)、緩存(cache)、對話框、處理偏好設(shè)置和注冊表(registry)的對象、日志對象,充當(dāng)打印機(jī)、顯卡等設(shè)備的驅(qū)動程序的對象。事實上,這類對象只能有一個實例,如果制造出多個對象,就會導(dǎo)致許多的問題產(chǎn)生,例如:程序的行為異常、資源使用過量,或者是不一致的結(jié)果。——《Head First設(shè)計模式》
使用環(huán)境
? 當(dāng)我們的對象在邏輯上只能有一個的時候,比如說打印機(jī)。想像一下,如果我們有兩個指向同一臺打印機(jī)的對象,這時我們應(yīng)該去響應(yīng)哪個對象的請求呢?顯然我們只能有一個打印機(jī)的對象,且這個對象還要互斥地去訪問,否則上述問題依舊存在。
優(yōu)點介紹
?1.可以在需要時才開始創(chuàng)建對象
?2.保證只有一對象被創(chuàng)建
思路分析
單件模式有兩個精髓:
?1.一個私有的構(gòu)造器
?2.一個靜態(tài)的成員變量,用于保存類的對象
? 如果你沒有一個私有的構(gòu)造器,那么我們完全可以不使用公開的getInstance()方法,而是直接使用類的構(gòu)造器來實現(xiàn);如果你沒有第一個靜態(tài)的成員變量來保存對象的對象,你就無法去保證此對象一直存在,這樣系統(tǒng)就會在適當(dāng)?shù)臅r候回收此對象。
因為上面兩點的約束,我們可以得到一個類似這樣的公開化的方法:
private static SingletonClass mSingletonClass = null;private SingletonClass() {}public static synchronized SingletonClass getInstance() {if (mSingletonClass == null) {mSingletonClass = new SingletonClass();}return mSingletonClass;}
上面的代碼中使用了關(guān)鍵字synchronized.這是為了在多線程中去互斥地訪問臨界資源而添加的。
但是你必須知道,同步一個方法可能造成程序執(zhí)行效率下降100倍。所以在你的程序中,如果 getInstance()?頻繁使用,那么就可能需要重新設(shè)計你的代碼以提高效率了。
雙重檢查加鎖
? 上面說到 getInstance() 在多線程中的使用可能會有一些不盡如人意的地方。那么要怎么來作一個修改,使得程序更完善呢?利用雙重檢查加鎖可以達(dá)到我們的目的。首先檢查是否實例已經(jīng)創(chuàng)建了,如果尚未創(chuàng)建,進(jìn)行同步。這樣的處理,使得程序只會在第一次發(fā)生同步,這正是合乎要求的。實現(xiàn)如下:
public static SingletonDoubleChecked getInstance() {if (mDoubleChecked == null) {synchronized (SingletonDoubleChecked.class) {if (mDoubleChecked == null) {mDoubleChecked = new SingletonDoubleChecked();}}}return mDoubleChecked;}
注意:雙重檢查加鎖不適用于1.4之前的版本。
類圖展示
代碼展示
SingletonClass.java
public class SingletonClass {private static SingletonClass mSingletonClass = null;private SingletonClass() {}public static synchronized SingletonClass getInstance() {if (mSingletonClass == null) {mSingletonClass = new SingletonClass();}return mSingletonClass;}public void printLabel() {System.out.println("Singleton Class Label.");} }
SingletonDoubleChecked.java
public class SingletonDoubleChecked {private volatile static SingletonDoubleChecked mDoubleChecked = null;private SingletonDoubleChecked() {}public static SingletonDoubleChecked getInstance() {if (mDoubleChecked == null) {synchronized (SingletonDoubleChecked.class) {if (mDoubleChecked == null) {mDoubleChecked = new SingletonDoubleChecked();}}}return mDoubleChecked;}public void printLabel() {System.out.println("SingletonDoubleChecked Class Label.");} }
TestMain.java
public class TestMain {public static void main(String[] args) {SingletonClass singletonClass = SingletonClass.getInstance();singletonClass.printLabel();SingletonDoubleChecked doubleChecked = SingletonDoubleChecked.getInstance();doubleChecked.printLabel();} }
效果圖
Github 源碼下載
https://github.com/William-Hai/DesignPatternCollections
總結(jié)
以上是生活随笔為你收集整理的Java设计模式——单件模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android涂鸦技术及刮刮乐示例分析
- 下一篇: 图灵机器人-Java/Android