1. 程式人生 > >單例模式之新的想法

單例模式之新的想法

dsi 配置 trac 單例對象 ack bool 感覺 曾經 Circul

前幾天被問到了單例模式對構造函數有什麽要求嗎?答曰:沒什麽要求吧?

回來查了下詳細的資料才發現,原來單例模式的實現private 的一個構造函數,目的是不讓這個單例的類可以new一個對象出來。

思考了下,事實上不加應該問題也不大,畢竟假設代碼上都是一個人在寫的話,事實上這樣的問題還是能夠規避的。可是又發現了其它新的一些想法。

先說下曾經寫的單例吧,事實上也非常easy,無非就是一個private static然後用getInstance返回,如今感覺想法確實有點幼稚。

上面說的那個private 的構造函數就不提了。個人感覺有當然最好,可是無也未嘗不可。

貼一段spring的源代碼看看spring的sigleton怎樣寫的先

/**
	 * Return the (raw) singleton object registered under the given name.
	 * <p>Checks already instantiated singletons and also allows for an early
	 * reference to a currently created singleton (resolving a circular reference).
	 * @param beanName the name of the bean to look for
	 * @param allowEarlyReference whether early references should be created or not
	 * @return the registered singleton object, or [email protected]
/* */ null} if none found */ protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { ObjectFactory singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return (singletonObject != NULL_OBJECT ? singletonObject : null); }


singletonObjects 是單例類中存儲當前單例對象的一個Map。在獲取單例的時候假設能取到則直接返回。假設沒有取到則加鎖產生一個對象返回。

依照spring的做法,對於配置文件裏的類進行註冊到singletonObjects 中

代碼例如以下:

/**
	 * Add the given singleton object to the singleton cache of this factory.
	 * <p>To be called for eager registration of singletons.
	 * @param beanName the name of the bean
	 * @param singletonObject the singleton object
	 */
	protected void addSingleton(String beanName, Object singletonObject) {
		synchronized (this.singletonObjects) {
			this.singletonObjects.put(beanName, (singletonObject != null ?

singletonObject : NULL_OBJECT)); this.singletonFactories.remove(beanName); this.earlySingletonObjects.remove(beanName); this.registeredSingletons.add(beanName); } }


然後在使用的時候依據singletonObjects 進行查詢並返回相應的對象。


單例模式之新的想法