我繼承了其單身聲明概述如下特定的類層次結構(有多個實現 - 我只是顯示的最小集來說明問題)。它的氣味到高天堂對我來說,最重要的是因爲單身正在從繼承,以及在基類中的方法instance
有其價值在子類的靜態初始化覆蓋。如何重構單身每個類都有一個getInstance()方法的類層次?
如果所有的實現是在foo.common
父包我認爲只是刪除了instance
成員,從他們getInstance()
方法,使類和它們的構造函數包本地和按照foo.common
一些公共工廠類創建一個實例每個,守住各自的內部(由它是否是的IReadOnly
或IReadWrite
實現分區)的該單一實例,並提供了一對夫婦,其中基於一些枚舉它會返回被詢問實施的接口類型的公共查詢方法。
但是實現可以在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
}
你能解釋爲什麼/你想如何重構它?我真的沒有看到任何問題。 – user845279