我继承了一个特定的单例类层次结构,其声明总结如下(还有更多的实现——我只是展示了最小的集合来演示问题)。对我来说,它闻起来像天堂,首先是因为继承了单例,以及instance
基类中的方式在子类的静态初始化程序中覆盖了它的值。
如果所有实现都在foo.common
父包中,我会考虑从它们中删除instance
成员和getInstance()
方法,使类及其构造函数成为本地包,并让一些公共工厂类foo.common
创建每个实例的单个实例,保留该单个实例每个内部(根据它是否是IReadOnly
or的实现来划分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
}