我最近编写了一个类库,其中包含一些对某些类型的文件建模的对象。比如有一个摘要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 等:用户无需重新编译代码即可获得新添加类型的好处。事实上,他们甚至不会注意到您进行了任何更改:如果操作正确,他们的代码将“正常工作”于他们从不知道存在的类型的文档。
附言如果您可以扫描字节数组并从中找出正确的类型,您的 API 就可以通过消除第二个参数来“为风格赢得一些分数”。
关于c# - 谁应该负责选择合适的派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11297236/