我最近写了一个类库,其中包括一些对象,这些对象对某些类型的文件建模。例如,有一个抽象的Document类,有派生类PdfDocument(具体的)和OfficeDocument(抽象的,有具体的派生类,如WordDocumentExcelDocument)等。
目前,客户机创建新对象的方式是选择适当的派生类并将字节数组传递给它。例如,如果我有一个pdfdocument和一个worddocument的字节数组,我将执行如下操作:

var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);

这种设计是否可以接受,客户机必须知道要使用什么派生类?或者我最好隐藏除抽象类之外的所有类,并使用抽象工厂模式之类的东西返回正确的派生类型?例如。:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is

请注意,派生类型没有向抽象类添加额外的属性/方法,它们只是以不同的方式实现抽象方法。

最佳答案

第二种方法比第一种方法好得多,因为它隐藏了来自您的库用户的Word和PDF文档存在的事实。当您决定添加更多的文档类型(如rtf、html等)时,这一点尤为重要:用户将获得新添加类型的好处,而无需重新编译代码。事实上,他们甚至不会注意到你已经改变了任何事情:如果做得对,他们的代码将“用”他们从未知道的类型的文件。
另外,如果你能扫描字节数组并从中找出正确的类型,你的api可以通过去掉第二个参数来“为样式赢得一些分数”。

08-27 21:13