Jive程式碼中AuthorizationFactory類

itworker發表於2008-05-31
昨天看jive原始碼的時候,看到AuthoricationFactory這個類,覺得其中有一個方法實現得很巧妙。如下:

......
private static String className =
        "com.jivesoftware.forum.database.DbAuthorizationFactory";
private static void loadAuthorizationFactory() {
        if (factory == null) {
            //Use className as a convenient object to get a lock on.
            synchronized(className) {
                if (factory == null) {
                    //See if the classname has been set as a Jive property.
                    String classNameProp = JiveGlobals.getJiveProperty(
                            "AuthorizationFactory.className");
                    if (classNameProp != null) {
                        className = classNameProp;
                    }
                    try {
                        Class c = Class.forName(className);
                        factory = (AuthorizationFactory)c.newInstance();
                    }
                    catch (Exception e) {
                        System.err.println("Exception loading class: " + e);
                        e.printStackTrace();
                    }
                }
            }
        }
    }
......
<p class="indent">

將sychronized(className)將className這個變數上鎖,防止了多個執行緒併發執行時其他執行緒對className進行寫操作。例如,假如不上鎖,執行緒一執行完className=classNameProp時,執行緒二執行了
className ="com.jivesoftware.forum.database.DbAuthorizationFactory";那麼便可能改變了clasName的值。而且將factory==null放在synchronized(className)的外層,可以省下不少開銷。
問題一、這裡的為什麼要使用單例模式?是為了只產生一個該類的實現類的例項而節省記憶體?
問題二、這裡的單例模式也有些奇怪,既然將className都上鎖了,為什麼還要在內部再加一個
if(factory == nullll)?
問題三、這裡的工廠中取得子類是透過持有自身的引用(當然引用所指的物件是它的子類)。那麼,這種方式和直接在類裡寫一個方法: public static AuthorizationFactory getInstance(){......},再透過此方法給該類的AuthorizationFactory引用返回具體例項相比有什麼區別與優勢呢?

相關文章