仅使用静态方法对类进行依赖注入?

Phi*_*l K 5 java design-patterns dependency-injection

我有一组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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我自己编写的默认API实现。

public class StaticApiImpl {
    public void doThing() {
        System.out.println("Do thing the default way.");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是第三方可能编写的默认实现的假设扩展版本:

public class MyCustomStaticApiImpl extends StaticApiImpl {
    @Override
    public void doThing() {
        System.out.println("Do thing differently.");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,开发人员只需在初始化插件时通过setter方法插入其依赖项即可:

public void onLoad() throws Exception {
    StaticApi.setImpl(new MyCustomStaticApiImpl());
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:这是正确的做法吗?也许有一些我从未听说过的专门针对此类情况的设计模式?

Bla*_*ake 2

您在这里设置的是一个工厂模式,客户端能够配置工厂返回的实现。这很好,但是您需要做一些不同的事情。

  1. 重命名StaticApiStaticApiFactory. 这将使其角色更加清晰,并避免与后续部分的命名冲突。
  2. 删除该public static void doSomething()方法。无需将所有 API 方法重新定义为静态方法。由于这是一个工厂类,因此您需要的只是一个获取当前实现的方法,例如public static StaticApi getInstance()返回已通过设置的实现的方法setImpl()
  3. 创建一个StaticApi定义 API 行为契约的接口。然后工厂类应该允许客户setImpl(StaticApi)
  4. 现在任何需要使用 StaticApi 的人都可以通过 获取参考StaticApiFactory.getInstance()