這是我的場景。用戶在我的軟件中選擇一個文檔,我的軟件從文檔中提取一些關鍵數據。該軟件處理兩種格式; 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)。那是正確的方法嗎?
對不起,我有點長,但我不知道如何完全描述我的情況。感謝您的想法。
舒賈特
謝謝瓦倫丁。這確實有幫助。我會在我的最後嘗試它,並將其標記爲答案,如果沒有更好的答案。 – dotNET 2012-07-24 18:49:48
當我實現這個時,有一件小事:爲什麼我應該選擇Singleton模式而不是像上面顯示的那樣使用靜態方法是否有很好的理由?至少在這種情況下,靜態方法不會像Singleton類那麼好? – dotNET 2012-07-25 05:38:49
更重要的是,工廠類的方法GetExtractor需要檢查pdf(或docx)文件的內容以決定它屬於哪個模板。另一方面,所有具體類都需要相同的功能(從pdf文件讀取內容),因爲它們將對這些內容進行實際解析。因此,我打算將ReadContents()函數添加到PdfExtractor類。您如何看待工廠類在不破壞模式和OO規則的情況下使用此函數? – dotNET 2012-07-25 06:29:13