我正在开发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:
相同的变体但params不是传递给工厂方法而是传递给Service实例(例如在其init()方法中)。
优点:用户可以根据需要更改服务密钥,而无需创建相同服务的新实例。
缺点:更复杂的方式,利润是值得怀疑的。
您更喜欢哪种变体?为什么?欢迎您的变种。
答案 0 :(得分:3)
您可以有两个工厂方法,一个用于传递包含参数的Map
,另一个用于不带参数:
ServiceFactory.createService(ServiceEnum type);
ServiceFactory.createService(ServiceEnum type, Map<String,?> params);
在这种情况下,调用者有责任正确获取参数,但它为您提供了最大的灵活性。
答案 1 :(得分:1)
我可能会使用选项1并将Properties
替换为Map
,这是Properties用于其底层实现的内容。