我继承了其单身声明概述如下特定的类层次结构(有多个实现 - 我只是显示的最小集来说明问题)。它的气味到高天堂对我来说,最重要的是因为单身正在从继承,以及在基类中的方法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