我有一组API类,其中只包含静态方法和一个私有构造函数,因此它们无法被实例化。然而,我希望第三方开发人员能够修改API的行为以适应他们的需求。
这是我目前的解决方案(通过静态setter方法进行依赖注入)。这是开发人员将使用的公共API类。如您所见,它依赖于StaticApiImpl
。
public class StaticApi {
private static StaticApiImpl impl = new StaticApiImpl();
private StaticApi() {}
public static void setImpl(StaticApiImpl impl) {
StaticApi.impl = impl;
}
public static void doThing() {
impl.doThing();
}
}
这是我编写的默认API实现。
public class StaticApiImpl {
public void doThing() {
System.out.println("Do thing the default way.");
}
}
这是第三方可能编写的默认实现的假想扩展版本:
public class MyCustomStaticApiImpl extends StaticApiImpl {
@Override
public void doThing() {
System.out.println("Do thing differently.");
}
}
开发人员只需通过setter方法在插件初始化时注入他们的依赖项即可:
public void onLoad() throws Exception {
StaticApi.setImpl(new MyCustomStaticApiImpl());
}
我的问题是:这样做是正确的吗?也许有一些专门针对这种情况的设计模式我没有听说过吗?