2012-07-11 47 views
3

正如所說的「如果我們有超類和n個子類,並且基於提供的數據,我們必須返回其中一個子類的對象,我們使用工廠模式「使用工廠設計模式時有點複雜

情況: 我有20個客戶端,更多可以隨時添加。每個將提供一個文件,從中提取數據並將其插入到數據庫中。每個客戶都有自己的維護文件的風格,即數據字段位於不同的地方。

解決方案: 爲此,我想我將不得不使用工廠設計模式,創建20個班,每個班都有自己的執行每一個領域,比如如何和它有哪個地方在文件解壓縮。當新的客戶被添加時,我只是創建一個新的類,我完成了,不需要其他更改。

我是否正確到這裏?

複雜性: 現在的問題是,客戶提供的文件,可以在任的4種格式(PDF,XLS(X),HTML,TXT)。從這些格式中提取文本的引擎必須是靜態的,就像我使用pdftoXML將PDF提取到XML等一樣。如果我不創建將PDF轉換爲XML的單獨引擎類,那麼我將不得不重新編寫在每個客戶端的類中提供PDF格式的PDF文本提取。 Excel抽取引擎也是如此。

問題: 我該如何將這些引擎裝入工廠模式?如果引擎類是靜態的,並且需要處理pdf的子類,請調用pdf類的提取方法來獲取需要的數據或什麼?

希望我自己清楚,感謝

回答

1

我覺得這是一個很好用的工廠方法,但不要試圖使用客戶端類層次結構的提取算法模型和。就模式而言,您可以使用Strategy以正確的提取算法動態配置客戶端對象。

+0

「客戶端類層次結構模型的提取算法以及」對不起,得到這個? – shabby 2012-07-12 03:18:27

+0

如果多個客戶端使用相同的提取算法,請勿嘗試將共享提取算法放入公共超類。找到另一種分享方式,或許使用策略模式。 – ComDubh 2012-07-12 11:34:16

+0

就像在這種情況下的策略的想法一樣,我認爲我應該去做這件事,但爲什麼不使用公共超類中的任何已知問題呢? – shabby 2012-07-13 03:13:02

1

您至少有兩件事情在這裏進行。

  1. 從一系列文件格式
  2. 根據客戶特定的規則解析這個文本中提取的文本。

我會完全分開這些功能。也許甚至有兩個工廠,一個用於文本提取和一個用於解析。執行解析的客戶端特定代碼不需要知道文本來自PDF,CSV,或者通過HTTP或其他方式進行傳送。它只需要知道解析文本。

希望這會有所幫助。

+0

我認爲一個更好的主意,但要連接這兩個?如果我創建了兩個工廠,解析的第一個工廠調用文本抽取工廠還是什麼? – shabby 2012-07-12 03:21:06

1

首先,幾個問題。這些可能會改變建議的解決方案:

  1. 20個客戶端中的每個客戶端是否都有一個FileFormat?
  2. 子類之間常見的(行爲/方法)是什麼?
  3. 是否有可能改變子類,使用不同的FileFormat?

在子類不需要切換文件類型最簡單的辦法,好像現在你可以有它由一組抽象類PdfProvider,XlsProvider,HtmlProvider和TxtProvider的子類的抽象的ContentProvider。這個中間層的類實現了文件格式特定的功能。然後你的20個「客戶」類繼承適當的FileFormat特定的基礎。

+0

1.不,他們可以有一個PDF/Excel或HTML文件 2.常見的行爲是像每個文件將有一個日期,客戶號,產品號。等等。 3.是的,它有一個小的機會,但我們不想迎合 – shabby 2012-07-13 03:06:32