2010-02-09 53 views
3

我正在开发API,它应该提供对基于远程Web服务的资源数量的简单访问。如何初始化类String数不确定的类?

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

对于每个Web服务我都有我的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:

同一的变体,但PARAMS被传递不工厂方法,而是服务实例(在其init()方法例如)。优点:如果用户不需要创建相同服务的新实例,用户可以更改其服务的密钥。

缺点:更复杂的方式,利润是值得怀疑的。

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

回答

3

您可以有两个工厂方法,一个在那里你传递一个包含参数Map,以及其他不带参数:

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

在这种情况下,这是主叫方获得的参数正确的责任,但它给你最大的灵活性。

1

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