2012-05-04 32 views
0

我繼承了其單身聲明概述如下特定的類層次結構(有多個實現 - 我只是顯示的最小集來說明問題)。它的氣味到高天堂對我來說,最重要的是因爲單身正在從繼承,以及在基類中的方法instance有其價值在子類的靜態初始化覆蓋。如何重構單身每個類都有一個getInstance()方法的類層次?

如果所有的實現是在foo.common父包我認爲只是刪除了instance成員,從他們getInstance()方法,使類和它們的構造函數包本地和按照foo.common一些公共工廠類創建一個實例每個,守住各自的內部(由它是否是的IReadOnlyIReadWrite實現分區)的該單一實例,並提供了一對夫婦,其中基於一些枚舉它會返回被詢問實施的接口類型的公共查詢方法。

但是實現可以在foo.common之外,並且foo.common不允許依賴於這種「更具體」的包,因爲foo.common用於許多應用程序的通用內容。所以簡單的事情是無法完成的。然後怎樣呢?

第一界面:

package foo.common.config; 
public interface IReadOnly 
{ 
    void load(); 
    String getVal(String key); 
} 

第二個接口:

package foo.common.config; 
public interface IReadWrite extends IReadOnly 
{ 
    void save(); 
    void setVal(String key, String value); 
} 

先執行:

package foo.common.config; 
public class ReadOnlyImpl implements IReadOnly 
{ 
    protected static IReadOnly instance; 

    static { 
     instance = new ReadOnlyImpl(); 
    } 

    public static IReadOnly getInstance() { 
     return instance; 
    } 

    protected ReadOnlyImpl() {} 

    // implement methods in IReadOnly 
} 

二實施

package foo.common.config; 
public class ReadWriteImpl extends ReadOnlyImpl implements IReadWrite 
{ 
    static { 
     instance = new ReadWriteImpl(); 
    } 

    public static IReadWrite getInstance() { 
     return (IReadWrite) instance; 
    } 

    protected ReadWriteImpl() { 
     super(); 
    } 

    // Implement methods in IReadWrite 
} 

三落實:

// While things in this package can depend 
// on things in foo.common, nothing in 
// foo.common is allowed to depend on this package. 
package foo.apps.someapp; 
public class MoreSpecificReadWriteImpl extends ReadWriteImpl 
{ 
    static { 
     instance = new MoreSpecificReadWriteImpl(); 
    } 

    public static IReadWrite getInstance() { 
     return (IReadWrite) instance; 
    } 

    protected MoreSpecificReadWrite() { 
     super(); 
    } 

    // Override superclass methods to do something specific 
} 
+0

你能解釋爲什麼/你想如何重構它?我真的沒有看到任何問題。 – user845279

回答

1

把包foo.apps.someapp不談,包foo.common.config的設計是錯誤的。

IReadOnly o1=ReadOnlyImpl.getInstance(); // ok, returns ReadOnlyImpl 
... 
ReadWrite o2=ReadWriteImpl.getInstance(); // ok, returns ReadWriteImpl 
... 
IReadOnly o3=ReadOnlyImpl.getInstance(); // bad, returns ReadWriteImpl, the same as o2. 

的原因是,所有類使用同一個靜態變量ReadOnlyImpl.instance。我將在所有類別,包括MoreSpecificReadWriteImpl使用單獨的變量。如果這不適合,那麼可以考慮使用Spring容器或類似的框架。

+0

是否有錯字的最後一行?與第一行相同。 – user845279

+0

沒有錯別字。這是不一樣的:o1和o3。 –

相關問題