2013-04-27 95 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()方法中。完全解耦。