5

我有一组 API 类,它们只包含静态方法和一个私有构造函数,因此它们不能被实例化。但是,我希望第三方开发人员能够修改 API 的行为以满足他们的需求。


这是我到目前为止的解决方案(通过静态设置方法进行依赖注入)。这是开发人员将使用的公共 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());
}

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

4

2 回答 2

2

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

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

对于您的 3rd 方开发人员来说,最好的解决方案是使用该Proxy模式。

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

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

于 2013-03-24T14:27:46.403 回答