我有一组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());
}
我的问题是:这是正确的做法吗?是否有一些专门用于此类案例的设计模式,我还没有听说过?
答案 0 :(得分:2)
答案 1 :(得分:2)
您在此处设置的是工厂模式,客户端可以配置工厂返回的实施。这很好,但有几件事你需要做的不同。
StaticApi
重命名为StaticApiFactory
。这将使其角色更加清晰,并避免与下一部分发生命名冲突。public static void doSomething()
方法。无需将所有API方法重新定义为静态方法。由于这是一个工厂类,所以你需要的只是获得当前实现的方法,例如一个public static StaticApi getInstance()
方法,它返回通过setImpl()
设置的实现。StaticApi
。然后工厂类应允许客户setImpl(StaticApi)
。StaticApiFactory.getInstance()
获得引用。