我有一个PluginClassLoader
which是一个抽象类,为项目的类加载器提供了99%的功能。我有2个子类(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
}
}
添加一个抽象方法来PluginManager
制作一个类加载器,并根据需要调用它。子类应重写该方法,并返回适当的子类:
public abstract class PluginManager {
public PluginManager() {
pluginLoader = MakeClassLoader();
}
...
protected abstract PluginClassLoader MakeClassLoader();
}
public class ServiceManager extends PluginManager {
...
protected abstract PluginClassLoader MakeClassLoader() {
return new ServiceClassLoader();
}
}
public class ChannelManager extends PluginManager {
...
protected abstract PluginClassLoader MakeClassLoader() {
return new ChannelClassLoader();
}
}
这实现了工厂方法设计模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句