如何使用Interface或Abstaract类隐藏实现类

时间:2016-03-16 09:11:56

标签: java oop design-patterns

我有这个场景。会有两种类型的项目构建,

  1. 正常构建
  2. 开发者构建。
  3. 如果是开发人员构建,我将需要编译更多的包并将它们包含在构建结构中。

    在这种情况下有共同文件MainClass

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

    如上所述MainClass是一个CommonResource,只有在Dev构建期间才会引用持有DeveloperFile的jar。 但在正常构建期间,这会导致编译错误。

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

3 个答案:

答案 0 :(得分:2)

您可以使用reflection来实例化您的课程。

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

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

或者更好的是,您可以使用在幕后使用反射的框架。例如,Spring就是这样做的。

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

答案 1 :(得分:2)

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

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

  • 您有一个注册表类,用于保存有关CommonInterface的实施可用的信息
  • 接口的具体实现有一个静态初始化程序,用注册表
  • 注册该类
  • 您提供要使用的实现的MainClass 名称(作为String,因此不会创建编译时依赖项)
  • MainClass调用Class.forName(implName),这会加载类并调用静态初始化程序,注册实现
  • 然后MainClass使用注册表作为工厂,调用registry.getCommonInterface()
  • 之类的内容

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

答案 2 :(得分:-2)

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

CommonInterface int1 = CommonInterfaceFactory.makeCommonInterfaceInstance();