2013-04-27 75 views
0

我有一个小的设计问题上,我希望得到一些建议允许最大的灵活/可扩展性:使用工厂

我有几类,从同一个基类继承,每个人都可以接受同样的数据并以稍微不同的方式进行分析。

Analyzer 
    | 
    ˪_ AnalyzerA 
    | 
    ˪_ AnalyzerB 
    ... 

我有一个定义了分析应该调用及其参数的输入文件(我没有对文件的格式控制)。另外,它也以相同的方式定义了数据提取器,也包含了其他类似的东西(类似的,我的意思是这是一个可以有多种变化的动作)。

我有一个模块在文件中不同的分析仪,它遍历并调用一些工厂,构建正确的分析。对于输入文件可以定义的每个原型,我都有一个工厂,并且非常好。

但是,如果我想扩展它,并添加一个新的类型分析是什么?

我在考虑的解决方案是为每个工厂使用属性文件,这些工厂将以工厂名称命名,并且它将在输入文件的任何想要执行的定义与实际类别之间保持映射关系用于执行操作。

这样我可以加载的类在运行时 - >验证它是否实施正确的接口,然后执行它。

如果某些John Doe想创建他自己的分析器,他只需要添加一个新的属性到正确的文件中(我不太清楚什么是允许这种属性定制的最佳策略) 。

因此,在短期:

  1. 是我的解决方案也有缺陷?
  2. 如果没有什么是用户友好/方便的方式来允许自定义属性?

P.S

  1. 不幸的是,我仅限于使用只建立JDK类为现有的解决方案,所以我不能刚落,在SF上他们。
  2. 我希望这个问题不会脱节我只是不习惯以这种方式削减我的翅膀,没有SF或其他人来帮助我实现一个优雅的解决方案。
+0

您可能会发现[程序员堆栈交换](http://programmers.stackexchange.com/)更适合这种类型的概念问题。 – Bobulous 2013-04-27 12:32:34

回答

0

看看java.sql.DriverManager.getConnection(connectionString)方法的实现方式。最好的方法是观看源代码。

的想法很粗略的总结(这是一个很大的私有方法藏在里面)。这或多或少是责任链的实现,尽管没有链接的驱动程序列表。

  1. DriverManager的管理驱动程序的列表。
  2. 每个驱动程序必须通过调用其方法registerDriver()将自身注册到DriverManager。
  3. 在请求连接时,getConnection(connectionString)方法会依次调用传递connectionString的驱动程序。
  4. 每个驱动程序都知道给定的连接字符串是否在其权限范围内。如果是,它创建连接并返回它。否则,控制权将传递给下一个驱动程序。

打个比方:

  • 司机=您的具体分析仪
  • 连接字符串=类型的文件要进行分析

优点:

  1. 没有必要明确地将分析仪与它们的文件类型绑定因为。让分析器自行决定是否能够分析文件。如果不是,则返回null(或异常或其他),以通知AnalyzerManager应该询问行中的下一个分析器。
  2. 添加新分析器意味着将新的调用添加到register()方法中。完全解耦。