3

我正在研究 API,它应该提供对许多基于远程 Web 服务的资源的简单访问。

其中一些远程资源需要在交互之前传递特殊参数。例如,其中一个需要传递一对开发者的密钥,另一个需要一对密钥和唯一标识符。第三个根本不需要这些参数。我现在正在使用 3 项服务,但它们的数量可以扩大。

对于每个网络服务,我都有相应的 API 实现。问题是我不知道如何向我的 API 引入传递未知数量的未知含义的字符串的可能性。

我的一些建议:

1.

ServiceFactory.createService (ServiceEnum type, Properties keys);

2.

ServiceFactory.createService (ServiceEnum type, ServiceParams params);

其中 ServiceParams 是一个标记接口。在这种情况下,我将有一些这样的助手类:

public class ServiceHelper {

   public static ServiceParams createFirstServiceParams (String secretKey, String publicKey);

   public static ServiceParams createSecondServiceParams (String secretKey, String publicKey, String uid);

   public static ServiceParams createThirdServiceParams ();
} 

优点:每个服务的有意义的参数名称。

缺点:如果我为第四项服务提供支持,那么用户将不得不更新工厂模块。在第一种情况下,用户只需下载新模块。

3.

ServiceFactory.createService (ServiceEnum type, String ... params);

优点:最容易使用。用户不需要做任何额外的动作(比如创建 ServiceParams 的属性)。

缺点:最不明显的方式。用户应该知道哪一组参数对应于他想要创建的服务。

4-6:

相同的变体,但参数不是传递给工厂方法,而是传递给服务实例(例如在它的 init() 方法中)。

优点:用户可以根据需要更改其服务的密钥,而无需创建同一服务的新实例。

缺点:方式比较复杂,利润值得商榷。

您更喜欢哪种变体?为什么?欢迎您的变体。

4

2 回答 2

3

您可以有两种工厂方法,一种是传递Map包含参数的方法,另一种是不传递参数的方法:

ServiceFactory.createService(ServiceEnum type);
ServiceFactory.createService(ServiceEnum type, Map<String,?> params);

在这种情况下,调用者有责任正确获取参数,但它为您提供了最大的灵活性。

于 2010-02-09T13:05:24.540 回答
1

我可能会选择选项 1 并替换PropertiesMap,这是 Properties 用于其底层实现的内容。

于 2010-02-09T13:14:43.143 回答