我最近编写了一个类库,其中包含一些对某些类型的文件进行建模的对象。比如有一个抽象Document
类,有派生类PdfDocument
(concrete)和OfficeDocument
(abstract,有具体派生类如WordDocument
and 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
请注意,派生类型不会向抽象类添加额外的属性/方法,它们只是以不同的方式实现抽象方法。