Java 基于http头中的应用程序类型交付应用程序数据对象的最佳工厂模式

Java 基于http头中的应用程序类型交付应用程序数据对象的最佳工厂模式,java,design-patterns,factory,Java,Design Patterns,Factory,我有一家使用我的webservice资源的多个应用程序的公司。我有一个web服务资源,它在http头中查找应用程序ID。这会告诉服务器哪个应用程序正在请求数据。我的目标是向我的web应用程序开发人员提供一种方法,他们可以调用该方法通过应用程序ID检索所有特定于应用程序的设置。 给定一个applicationID,我可以指定该应用程序的设备类型、属性文件,以及GCM、APNS或Microsoft推送通知等。因此每个applicationID基本上都有不同的属性 我希望开发人员能够像这样调用此对象(

我有一家使用我的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部分正是我所说的