基于http标头中的应用程序类型提供应用程序数据对象的最佳工厂模式

时间:2016-02-07 17:18:46

标签: java design-patterns factory

我使用我的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();(或类似的东西),并且将引用正确的应用程序信息。我不必在这里使用工厂,或者只是我想到的第一件事。

2 个答案:

答案 0 :(得分:2)

所以你的问题在于标准的逻辑在工厂方法中。同时,您不希望用户将条件作为因子方法的参数提供。

首先,我不喜欢有静态Request课程的想法。请求应该是包含有关当前请求的信息的对象。一旦你有很多并发请求(我怎么知道哪个请求是哪个?),我怀疑你的代码可能会出现竞争条件。因此,作为一个起点,我将重构Request类,以便您使用Request的实例。

我认为,最明确的方法是将applicationID作为参数传递。这使得可测试性变得微不足道,代码也变得非常明显。您接受输入并根据输入生成输出。您可以传递Request而不是applicationID,让工厂处理请求中applicationID的检索(正如您现在所做的那样)。

如果您认为Request - > applicationID逻辑不应该是工厂的一部分,您可以创建另一个类,例如将ApplicationIDResolver转换为Request的{​​{1}}。从那时起applicationID将通过实例使用,ApplicationDataFactory将是构造函数参数。 (我认为,这太过分了。)另一种方法是向ApplicationIDResolver类添加getApplicationID()方法。

如果使用依赖注入框架,它可能会自动为您处理对象生命周期/范围,因此Request可以是请求范围的对象,您可以告诉您的依赖注入框架实例化{ {1}}基于请求的对象,并将它们注入到使用它们的类中。

答案 1 :(得分:0)

最好用于此目的实现ApplicationData接口并定义每个条目的枚举。您可以通过枚举中的valueOf()来解决问题。