[英]Who should be responsible for selecting the appropriate derived class?
我最近編寫了一個類庫,其中包含一些對某些類型文件進行建模的對象。 例如,有一個抽象的Document
類,派生類PdfDocument
(具體)和OfficeDocument
(抽象,帶有具體的派生類,如WordDocument
和ExcelDocument
)等。
目前,客戶端創建新對象的方式是選擇適當的派生類並將其傳遞給字節數組。 所以例如,如果我有一個PdfDocument和WordDocument的字節數組,我會做類似的事情:
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
這是可接受的設計,客戶端必須知道要使用的派生類嗎? 或者我最好隱藏除抽象Document
類之外的所有類,並使用諸如抽象工廠模式之類的東西來返回正確的派生類型? 例如:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
請注意,派生類型不會向抽象類添加其他屬性/方法,它們只是以不同方式實現抽象方法。
第二種方法比第一種方法好得多,因為它隱藏了來自庫用戶的Word和Pdf文檔存在的事實。 當您決定添加更多文檔類型(例如Rtf,Html等)時,這一點變得尤為重要:用戶可以獲得新添加類型的好處,而無需重新編譯代碼。 實際上,他們甚至都沒有注意到你已經改變了任何東西:如果做得對,他們的代碼將“正常”處理他們從未知道的類型的文檔。
PS如果您可以掃描字節數組並從中找出正確的類型,那么您的API可以通過消除第二個參數來“獲得一些樣式點”。
如果派生類型沒有添加任何屬性/方法,並且您具有確定給定byte []使用什么類型的技術能力,我甚至不會將派生類公開...它們只是增加了表面區域消費者在學習圖書館時必須解析的東西。 只需要一個靜態工廠方法,如public static Document OpenDocument(byte[] data)
類中的public static Document OpenDocument(byte[] data)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.