使用工厂允许最大的灵活性/可扩展性

时间:2013-04-27 12:06:40

标签: java design-patterns

我有一些设计问题,我希望得到一些建议:

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

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

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

我有一个模块,它迭代文件中的不同分析器并调用一些构建正确分析器的工厂。我为输入文件可以定义的每个原型都有一个工厂,到目前为止一直很好。

但是,如果我想扩展它并添加一种新型分析器呢?

我正在考虑的解决方案是为每个工厂使用一个属性文件,该工厂将以工厂名称命名,它将在输入文件的任何它想要我执行的定义和我使用的实际类之间保持一个映射。执行行动。

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

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

简而言之:

  1. 我的解决方案是否太有缺陷了?
  2. 如果没有最方便用户/方便的方式来定制属性?
  3. P.S

    1. 不幸的是,我仅限于使用JDK类构建作为现有的解决方案,所以我不能只在它上面使用SF。
    2. 我希望这个问题不会脱节我只是不习惯用这种方式剪掉我的翅膀,没有SF或其他一些来帮助我实现优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

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

非常粗略的想法总结(它隐藏在很多私有方法中)。它或多或少是责任链的实现,尽管没有相关的驱动因素列表。

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

    • drivers =您的具体分析员
    • 连接字符串=要分析的文件类型

    优点:

    1. 无需将分析器与其所针对的文件类型明确绑定。让分析器自行决定是否能够分析文件。如果没有,则返回null(或异常或其他)以告诉AnalyzerManager应该询问行中的下一个分析器。
    2. 添加新分析器只是意味着添加对register()方法的新调用。完全脱钩。