2012-05-04 29 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。 –

相关问题