程式設計師,你只能有一個媳婦兒!

weixin_34208283發表於2016-10-10

【威哥說】今天是10月10日了,上班第3天,大家應該已經調整好狀態了吧!既然選擇了前方便風雨兼程,不要有一絲的鬆懈。將來的你一定會感謝現在努力拼命的自己。【也許你的朋友正在等你轉發到朋友圈】

【正文】

設計模式是前人在開發過程中總結的一些經驗,我們在開發過程中根據實際的情況,套用合適的設計模式,可以使程式結構更加簡單,利於程式的擴充套件和維護,但也不是沒有使用設計模式的程式就不好,如簡單的程式就不用了,有種畫蛇添足的感覺。

單例模式可以說是所有模式中最簡單的一種,它自始至終只能建立一個例項,可以有兩種形式,分別為懶漢式和餓漢式。

餓漢式,很簡單,一開始就建立了例項,實際上到底會不會被呼叫也不管

/**

* 餓漢式,執行緒安全

*

* @author 才子

*

*/

public class SingletonHungry {

private static SingletonHungry instance = new SingletonHungry();

private SingletonHungry() {

}

public static SingletonHungry getInstance() {

return instance;

}

}

懶漢式,由於是執行緒不安全的,在多執行緒中處理會有問題,所以需要加同步

/**

* 懶漢式,這是執行緒不安全的,如果有多個執行緒在執行,有可能會建立多個例項

*

* @author 才子

*

*/

public class SingletonIdler {

private static SingletonIdler instance = null;

private SingletonIdler() {

}

public static SingletonIdler getInstance() {

if (instance == null) {

instance = new SingletonIdler();

}

return instance;

}

}

加了同步之後的程式碼,每次進來都要判斷下同步鎖,比較費時,還可以進行改進

/**

* 懶漢式

*

* @author 才子

*

*/

public class SingletonIdler {

private static SingletonIdler instance = null;

private SingletonIdler() {

}

public synchronized static SingletonIdler getInstance() {

if (instance == null) {

instance = new SingletonIdler();

}

return instance;

}

}

加同步程式碼塊,只會判斷一次同步,如果已經建立了例項就不會判斷,減少了時間

/**

* 懶漢式

*

* @author 才子

*

*/

public class SingletonIdler {

private static SingletonIdler instance = null;

private SingletonIdler() {

}

public static SingletonIdler getInstance() {

if (instance == null) {

synchronized (SingletonIdler.class) {

if (instance == null)

instance = new SingletonIdler();

}

}

return instance;

}

}

單例模式在Androidd原生應用中也有使用,如Phone中NotificationMgr.java類

private static NotificationMgr sInstance;

private NotificationMgr(PhoneApp app) {

mApp = app;

mContext = app;

mNotificationManager = (NotificationManager) app

.getSystemService(Context.NOTIFICATION_SERVICE);

mStatusBarManager = (StatusBarManager) app

.getSystemService(Context.STATUS_BAR_SERVICE);

mPowerManager = (PowerManager) app

.getSystemService(Context.POWER_SERVICE);

mPhone = app.phone; // TODO: better style to use mCM.getDefaultPhone()

// everywhere instead

mCM = app.mCM;

statusBarHelper = new StatusBarHelper();

}

static NotificationMgr init(PhoneApp app) {

synchronized (NotificationMgr.class) {

if (sInstance == null) {

sInstance = new NotificationMgr(app);

// Update the notifications that need to be touched at startup.

sInstance.updateNotificationsAtStartup();

} else {

Log.wtf(LOG_TAG, "init() called multiple times!  sInstance = "

+ sInstance);

}

return sInstance;

}

}

相關文章