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

时间:2013-03-24 14:19:11

标签: 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();
    }
}

这是我自己编写的默认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());
}

我的问题是:这是正确的做法吗?是否有一些专门用于此类案例的设计模式,我还没有听说过?

2 个答案:

答案 0 :(得分:2)

第三方开发者的最佳解决方案是使用Proxy模式。

http://en.wikipedia.org/wiki/Proxy_pattern

将实现对象设置为实例并不是一个很好的解决方案。

答案 1 :(得分:2)

您在此处设置的是工厂模式,客户端可以配置工厂返回的实施。这很好,但有几件事你需要做的不同。

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