嗨我的问题是这个.假设您有一个接口,用于定义如何实现转换器.这个接口可以有一个方法loadDocument()和另一个convert().现在假设我们想要有多个转换器,ConvertHTML2DOC,ConvertXML2HTML等,你就会明白这一点.
假设您获得了转换为2个字符串所需的两种格式(无论如何获得它们都无关紧要).现在,您需要创建转换器的实例并转换文档.
我的问题是哪个更好:实际创建一个精心设计的if语句或通过Class类反射加载类?为了证明我写了一个我的意思的小例子.在我的例子中,我有两个共享一个接口的P1和P2类.我还创建了50000个以显示速度差异.事实证明,正常的调用稍微快一点,但我认为在一个复杂的例子中,例如我在开头提到的那个,通过Class方法创建类的好处更方便,更易于维护.你的想法是什么?
import java.util.*; public class Test { public static void main(String[] args) { try { Random r = new Random(); Date test1start = new Date(); for (int i = 0; i<= 50000; i++){ Printable p = (Printable)Class.forName("P"+(r.nextInt(2)+1)).newInstance(); System.out.println(p.getString()); } Date test1stop = new Date(); Date test2start = new Date(); for (int i = 0; i<= 50000; i++){ Printable p; if (r.nextInt(2) == 0 ) { p = new P1(); } else { p = new P2(); } System.out.println(p.getString()); } Date test2stop = new Date(); System.out.println("Test with 'Class' invocation took "+(test1stop.getTime()-test1start.getTime())+" milliseconds."); System.out.println("Test with 'normal' invocation took "+(test2stop.getTime()-test2start.getTime())+" milliseconds."); } catch (Exception e) { } } } interface Printable { public String getString(); } class P1 implements Printable { public String getString(){ return "1"; } } class P2 implements Printable { public String getString(){ return "2"; } }
Daniel Paull.. 6
你应该遵循Javier的建议 - 工厂注册表是解决这个问题的正确方法.我过去已经多次实现它,用于格式转换或其他一些可扩展的"谓词"工厂解决方案(例如,基于反射信息的自动GUI生成).
然而,我建议添加一个设计 - 引入所有翻译人员的目标域模型(CDM).假设你有格式A,B和C,你需要支持每个格式之间的转换 - 你得到所有的排列:
A - > B.
A - > C.
B - > A.
B - > C.
C - > A.
C - > B.
随着格式数量的增长,您将获得大量的转换!更好的想法是将每个转换分成两部分 - 让我们称之为导入器和导出器.导入器将格式转换为公共域模型(CDM),而导出将CDM转换为某种格式.
例如,我们将从A到B的转换分解为以下内容:
A - > CDM(这是一个导入)
CDM - > B(这是一个出口)
现在,当您想要添加新格式时,您只需要编写导入程序和导出程序,但您可以从所有其他格式进行翻译!谈论可扩展性!它还允许您可以读取但不能写入的格式,反之亦然.
因此,解决方案是拥有进口商工厂的注册表和出口商工厂的注册表.
你应该遵循Javier的建议 - 工厂注册表是解决这个问题的正确方法.我过去已经多次实现它,用于格式转换或其他一些可扩展的"谓词"工厂解决方案(例如,基于反射信息的自动GUI生成).
然而,我建议添加一个设计 - 引入所有翻译人员的目标域模型(CDM).假设你有格式A,B和C,你需要支持每个格式之间的转换 - 你得到所有的排列:
A - > B.
A - > C.
B - > A.
B - > C.
C - > A.
C - > B.
随着格式数量的增长,您将获得大量的转换!更好的想法是将每个转换分成两部分 - 让我们称之为导入器和导出器.导入器将格式转换为公共域模型(CDM),而导出将CDM转换为某种格式.
例如,我们将从A到B的转换分解为以下内容:
A - > CDM(这是一个导入)
CDM - > B(这是一个出口)
现在,当您想要添加新格式时,您只需要编写导入程序和导出程序,但您可以从所有其他格式进行翻译!谈论可扩展性!它还允许您可以读取但不能写入的格式,反之亦然.
因此,解决方案是拥有进口商工厂的注册表和出口商工厂的注册表.