我使用我的webservice资源开展了多个应用程序的业务。我有一个Web服务资源,它在http标头中查找应用程序ID。这告诉服务器哪个应用程序正在请求数据。我的目标是向我的Web应用程序开发人员提供一种方法,他们可以通过应用程序ID调用所有特定于应用程序的设置。 给定applicationID我可以指定设备类型,该应用程序的属性文件,以及GCM,APNS或Microsoft推送通知等。因此每个applicationID基本上具有不同的属性。
我希望开发人员能够像这样(或类似)调用此对象:
ApplicationData appData = ApplicationDataFactory.getCurrentApplicationData();
工厂看起来像这样:
class ApplicationDataFactory
{
public static ApplicationData getCurrentApplicationData()
{
//notice how im not passing in criteria here, im getting it from the request so call doens't have to know
String criteria = Request.getHTTPHeaderInfo("applicationID");
if ( criteria.equals("Android") )
return new Android();
else if ( criteria.equals("Android-germany") )
return new Android_germany();
else if ( criteria.equals("ios_germany") )
return new ios_germany();
else if ( criteria.equals("ios"))
return new ios();
else if ( criteria.equals("windows") )
return new windows();
return null;//or throw exception
}
}
所以Android,ios和windows对象都清楚地延伸到ApplicationData类。
例如,Android.java对象如下所示:
class Android extends ApplicationData{
@override
public String getType(){
return "Android"
}
@override
public Properties getProperties{
return system.getProperties("android.properties");
}
}
和Android德国和ios-germany将有来自德国的共同数据。
首先,我不喜欢我指定工厂内的标准,任何人都可以帮助我
有一个好的设计模式我可以用来实现这个目标吗?请记住,最后我希望能够让开发人员只调用ApplicationDataFactory.getCurrentApplicationData();
(或类似的东西),并且将引用正确的应用程序信息。我不必在这里使用工厂,或者只是我想到的第一件事。
答案 0 :(得分:2)
所以你的问题在于标准的逻辑在工厂方法中。同时,您不希望用户将条件作为因子方法的参数提供。
首先,我不喜欢有静态Request
课程的想法。请求应该是包含有关当前请求的信息的对象。一旦你有很多并发请求(我怎么知道哪个请求是哪个?),我怀疑你的代码可能会出现竞争条件。因此,作为一个起点,我将重构Request
类,以便您使用Request
的实例。
我认为,最明确的方法是将applicationID
作为参数传递。这使得可测试性变得微不足道,代码也变得非常明显。您接受输入并根据输入生成输出。您可以传递Request
而不是applicationID
,让工厂处理请求中applicationID
的检索(正如您现在所做的那样)。
如果您认为Request
- > applicationID
逻辑不应该是工厂的一部分,您可以创建另一个类,例如将ApplicationIDResolver
转换为Request
的{{1}}。从那时起applicationID
将通过实例使用,ApplicationDataFactory
将是构造函数参数。 (我认为,这太过分了。)另一种方法是向ApplicationIDResolver
类添加getApplicationID()
方法。
如果使用依赖注入框架,它可能会自动为您处理对象生命周期/范围,因此Request
可以是请求范围的对象,您可以告诉您的依赖注入框架实例化{ {1}}基于请求的对象,并将它们注入到使用它们的类中。
答案 1 :(得分:0)
最好用于此目的实现ApplicationData接口并定义每个条目的枚举。您可以通过枚举中的valueOf()来解决问题。