2016-03-16 84 views
2

我有这个场景与我。会有项目构建的两种口味,如何使用Interface或Abstaract类隐藏实现类

  1. 普通身材
  2. 开发人员版本。

在开发人员构建的情况下,我将需要编译更少的包并将它们包含在构建结构中。

有一个在此情况下常见的文件MainClass

Mainclass { 
    if(devFeature){ 
     CommonInterface int = new DeveloperFile(); 
     ........ other logic ...... 
    }else{ 
     CommonInterface int = new NormalFile(); 
     ........ other logic ...... 
    } 
} 

如上MainClass是一个公共资源的罐子保持DeveloperFile仅在开发建立被引用。 但在正常构建期间,这会导致编译错误。

我该如何解决这个问题?任何具体的设计模式?

回答

2

你可以使用reflection实例化你的类。

这是一个基本的例子,该concreteClass变量可以从文件中读取或作为参数传递到main方法:

String concreteClass = ... 
CommonInterface instance = Class.forName(concreteClass).newInstance(); 
... 

或者更好,你可以使用使用反射框架在幕后为你。举个例子,Spring就是这样做的。

在这种情况下,使用具体类或其他类只需修改配置文件。

2

Inversion of Control可能是这里最合适的模式(在Java中,这样做的一个框架是Spring,另一个流行的是JEE的EJB),因为你基本上需要的是让环境告诉MainClass要使用哪个类。

您可以使用的另一种模式是Service Locator pattern。你可以看一下的JDBC驱动程序如何定位 - 在之前的版本JDBC4,它基本上是这样的:

  • 你有注册表类,保持在什么执行CommonInterface
  • 信息接口的具体实现具有与注册表
  • 注册类静态初始化你给使用(作为String执行你的MainClass,所以没有编译 - 时间依赖性创建)
  • MainClass电话Class.forName(implName),这种加载类和调用静态初始化,注册
  • 然后MainClass使用注册表作为工厂实施,呼吁像registry.getCommonInterface()

JDBC4使用Java内置的Service provider机制,您也可以使用它。

-2

简单一点:使用工厂。您真正需要的是有CommonInterfaceFactory两个版本,一个创建DeveloperFile的实例,另一个创建NormalFile的实例。确保第一个包含在开发人员构建中,第二个包含在正常构建中。

CommonInterface int1 = CommonInterfaceFactory.makeCommonInterfaceInstance(); 
+0

因此,你建议有两个不同的类共享相同的名称? EWWW。那么为什么要打扰工厂,而不是使用两个同名的'CommonInterface'实现? –

+0

“Ewww”?大声笑。不完全是一个精辟的批评,但让你的观点。 –

+0

但是,当然,为什么不呢?你可以肯定有两个不同的具有相同名称的实现。当为JNI代码提供平台特定的实现时,这是相当普遍的。 –