2012-07-24 76 views
0

這是我的場景。用戶在我的軟件中選擇一個文檔,我的軟件從文檔中提取一些關鍵數據。該軟件處理兩種格式; PDF和DOCX。對於這些類型中的每一種,都有幾個模板,上傳的文檔應該屬於這些模板之一。我不知道這是否是一個衆所周知的問題,並且如果存在已經建立的設計模式來解決這種情況(這就是爲什麼我是這樣)。這是我迄今爲止設計的內容:尋找[也許]設計模式

由於每個模板都有特定的結構/內容,因此我正在考慮爲每個模板創建單獨的類。將會有一個名爲IExtractor的頂級界面,然後會有兩個名爲PdfExtractor和DocxExtractor的頂級類,每個類都實現IExtractor界面。所有PDF(或DOCX)模板通用的任何功能都將進入這些父類。

在這兩個父類下面,會有幾個模板類,每個模板一個。例如,一個名爲Template571_PdfExtractor的類從PdfExtractor繼承,具有特定於模板571的方法,但以與其他任何提取器相同的形式提供結果。

我正在使用C#4.0,如果這很重要。這裏的骨架:

接口:

interface IExtractor 
{ 
void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill); 
} 

兩個父類:

public class DocxExtractor : IExtractor 
{ 
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill) 
    { 
    } 
} 

public class PdfExtractor : IExtractor 
{ 
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill) 
    { 
    } 
} 

一個具體的類的:

public class Template571_PdfExtractor : PdfExtractor 
{ 
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill) 
    { 
    } 
} 

現在有幾個關鍵問題我不確定。所有這些都圍繞着我不知道如何以及在何處實例化具體(模板)類的對象的問題。我可以使用文件擴展名來決定是否需要關閉PdfExtractor樹節點或DocxExtractor節點。之後,文件的內容告訴我用戶文檔屬於哪個模板。那麼我在哪裏放置這個「決定」代碼?我的想法是將其放入PdfExtractor類(或DocxExtractor)。那是正確的方法嗎?

對不起,我有點長,但我不知道如何完全描述我的情況。感謝您的想法。

舒賈特

回答

1

一旦你深入瞭解設計模式和這樣的你一定會發現,大多數的時候有實現的東西沒有一個正確的方法...

一種可能的方式是創建所謂的工廠類:一個用於PdfExtractors,另一個用於DocXExtractors。每個工廠類可能會具有像

public final class PdfExtractorFactory { 
    public static PdfExtractor getExtractor(String filename) { ... } 

    ... // constructor, or singleton getter here 
} 

邏輯單一的靜態方法,以在PdfExtractor實例的具體子類來決定返回(即要使用的模板)將高於居住在工廠方法。這樣,抽象基類PdfExtractor及其子類都不會被這個決策邏輯混淆。只有工廠類需要知道PdfExtractor(或DocXExtractor)的子類,並且由於工廠通過超類的實例,其餘的代碼將完全不知道具體的子類。

因爲你可能只需要PdfExtractorFactory和DocXExtractorFactory的單個實例,您可以選擇執行這些工廠類爲單身。

更新:當然,你可以使用一個靜態工廠方法或Singleton模式和非靜態工廠方法(但你並不需要兩者)。

+0

謝謝瓦倫丁。這確實有幫助。我會在我的最後嘗試它,並將其標記爲答案,如果沒有更好的答案。 – dotNET 2012-07-24 18:49:48

+0

當我實現這個時,有一件小事:爲什麼我應該選擇Singleton模式而不是像上面顯示的那樣使用靜態方法是否有很好的理由?至少在這種情況下,靜態方法不會像Singleton類那麼好? – dotNET 2012-07-25 05:38:49

+0

更重要的是,工廠類的方法GetExtractor需要檢查pdf(或docx)文件的內容以決定它屬於哪個模板。另一方面,所有具體類都需要相同的功能(從pdf文件讀取內容),因爲它們將對這些內容進行實際解析。因此,我打算將ReadContents()函數添加到PdfExtractor類。您如何看待工廠類在不破壞模式和OO規則的情況下使用此函數? – dotNET 2012-07-25 06:29:13