我有一个PluginClassLoader
这是一个抽象类,它为我的项目的类加载器提供了99%的功能。我有两个子类(ServiceClassLoader
和ChannelClassLoader
),它们延伸PluginClassLoader
,仅比包装和一些自定义日志记录多一点。这两种实现中99%的逻辑是相同的。将扩展实现中的抽象类细节分开
我然后有一个PluginManager
这也是其具有2个实施方式中,扩展它(ServiceManager
和ChannelManager
),其是包装加上定制记录和更方便的构造的抽象类。
我遇到的麻烦是,在我的PluginManager
中,必须能够实例化一个新的类加载器类型,即ServiceClassLoader
或ChannelClassLoader
。我试图避免让我的PluginManager
耦合到它当前的实现(即我希望能够添加未来实现的灵活性,但不会改变PluginManager
的逻辑),所以尽量避免传入一些Enum
并使用一些:
if (classLoaderType instanceof ClassLoaderType.SERVICE) {
// do logic for instantiating ServiceClassLoader
}
样品的类层次:
public abstract class PluginManager {
// logic for managing plugins and when to load them
// ...
// somewhere deep in a loadPlugin(final File directory) method
pluginLoader = new PluginClassLoader(); // <-- not valid, can't instantiate
// an abstract class,
// and it's of the wrong type!
}
public abstract class PluginClassLoader extends URLClassLoader {
// class loader logic
}
public class ServiceManager extends PluginManager {
// wrapper for PluginManager with some customized logging
}
public class ServiceClassLoader extends PluginClassLoader {
// wrapper for PluginClassLoader with some customized logging
}
试图避免做这样的事情:
public abstract class PluginManager {
private final PluginType pluginType;
public PluginManager(final PluginType pluginType) {
this.pluginType = pluginType;
}
// logic ...
// somewhere deep in the loadPlugin(final File directory) method
if (pluginType instanceof PluginType.SERVICE) {
pluginLoader = new ServiceClassLoader();
// more logic
} else if (plugintype instanceof PluginType.CHANNEL) {
pluginLoader = new ChannelClassLoader();
// more logic
}
}
我不清楚什么是确定要使用的类加载器。应该一个ServiceManager总是创建一个ServiceClassLoader,而其他一些PluginManager子类总是使用一个PluginClassLoader? – 2014-12-04 17:18:46
@JonSkeet就是这样。我试图避免重写每个管理器的'loadPlugin()'方法,因为99%的细节是相同的,实际上只有这条线会有所不同。 – SnakeDoc 2014-12-04 17:19:50