Java 基于http头中的应用程序类型交付应用程序数据对象的最佳工厂模式
我有一家使用我的webservice资源的多个应用程序的公司。我有一个web服务资源,它在http头中查找应用程序ID。这会告诉服务器哪个应用程序正在请求数据。我的目标是向我的web应用程序开发人员提供一种方法,他们可以调用该方法通过应用程序ID检索所有特定于应用程序的设置。 给定一个applicationID,我可以指定该应用程序的设备类型、属性文件,以及GCM、APNS或Microsoft推送通知等。因此每个applicationID基本上都有不同的属性 我希望开发人员能够像这样调用此对象(或类似对象): 工厂看起来是这样的:Java 基于http头中的应用程序类型交付应用程序数据对象的最佳工厂模式,java,design-patterns,factory,Java,Design Patterns,Factory,我有一家使用我的webservice资源的多个应用程序的公司。我有一个web服务资源,它在http头中查找应用程序ID。这会告诉服务器哪个应用程序正在请求数据。我的目标是向我的web应用程序开发人员提供一种方法,他们可以调用该方法通过应用程序ID检索所有特定于应用程序的设置。 给定一个applicationID,我可以指定该应用程序的设备类型、属性文件,以及GCM、APNS或Microsoft推送通知等。因此每个applicationID基本上都有不同的属性 我希望开发人员能够像这样调用此对象(
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
}
}
class Android extends ApplicationData{
@override
public String getType(){
return "Android"
}
@override
public Properties getProperties{
return system.getProperties("android.properties");
}
}
所以Android、ios和windows对象都明显地扩展了ApplicationData类
例如,Android.java对象如下所示:
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
}
}
class Android extends ApplicationData{
@override
public String getType(){
return "Android"
}
@override
public Properties getProperties{
return system.getProperties("android.properties");
}
}
安卓德国和ios德国将拥有共同的数据,因为它们都来自德国
首先,我不喜欢我在工厂里指定标准,还有谁能帮我吗
有了一个好的设计模式,我可以用它来实现这一点吗?记住,最后我希望开发人员只调用
ApplicationDataFactory.getCurrentApplicationData()代码>(或类似内容)和正确的应用程序信息将被发送。我也不必在这里使用工厂,这只是我想到的第一件事 最好使用enum实现ApplicationData接口并定义每个条目。您可以通过enum中的valueOf()解析正确的值。为了实现此目的,最好使用实现ApplicationData接口并定义每个条目的enum。您可以通过enum中的valueOf()解析property。因此您的问题在于,条件的逻辑在工厂方法中。同时,您不希望用户将标准作为参数提供给factor方法
首先,我不喜欢使用静态的请求
类。请求应该是包含有关当前请求信息的对象。我怀疑,一旦您有许多并发请求(如何知道哪个请求是哪个请求?),您的代码可能容易出现竞争条件。因此,作为起点,我将重构Request
类,以便处理Request
的实例
我认为,最清晰的方法是将applicationID
作为参数传入。这使得可测试性变得微不足道,代码也变得非常明显。您接受一个输入并根据输入生成输出。您可以传递请求
而不是应用程序ID
,并让工厂处理从请求中检索应用程序ID
(如您现在所做的)
如果您认为Request
->applicationID
逻辑不应该是工厂的一部分,您可以创建另一个类,例如applicationdresolver
,它将请求
转换为applicationID
。从那时起,ApplicationDataFactory
将通过实例使用,applicationdresolver
将是一个构造函数参数。(我认为,这是一种过分的做法。)。另一个选项是向请求
类添加getApplicationID()
方法
如果您使用依赖项注入框架,它可能会自动为您处理对象生命周期/范围,因此,ApplicationData
可以是一个请求范围的对象,您可以告诉依赖项注入框架基于请求实例化ApplicationData
对象,并将它们注入到使用它们的类中。因此,您的问题在于,标准的逻辑在工厂中方法。同时,您不希望用户将标准作为参数提供给factor方法
首先,我不喜欢使用静态的请求
类。请求应该是包含有关当前请求信息的对象。我怀疑,一旦您有许多并发请求(如何知道哪个请求是哪个请求?),您的代码可能容易出现竞争条件。因此,作为起点,我将重构Request
类,以便处理Request
的实例
我认为,最清晰的方法是将applicationID
作为参数传入。这使得可测试性变得微不足道,代码也变得非常明显。您接受一个输入并根据输入生成输出。您可以传递请求
而不是应用程序ID
,并让工厂处理从请求中检索应用程序ID
(如您现在所做的)
如果您认为Request
->applicationID
逻辑不应该是工厂的一部分,您可以创建另一个类,例如applicationdresolver
,它将请求
转换为applicationID
。从那时起,ApplicationDataFactory
将通过实例使用,applicationdresolver
将是一个构造函数参数。(我认为,这是一种过分的做法。)。另一个选项是向请求
类添加getApplicationID()
方法
如果您使用依赖项注入框架,它可能会自动为您处理对象生命周期/范围,因此,ApplicationData
可以是一个请求范围的对象,您可以告诉依赖项注入框架基于请求实例化ApplicationData
对象,并将它们注入到使用它们的类中。显示最终调用?开发者会怎么称呼它?给我看最后一个电话?开发人员会怎么称呼它?DI部分正是我所说的