8

我最近编写了一个类库,其中包含一些对某些类型的文件进行建模的对象。比如有一个抽象Document类,有派生类PdfDocument(concrete)和OfficeDocument(abstract,有具体派生类如WordDocumentand 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

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

4

2 回答 2

9

第二种方法比第一种方法好得多,因为它向图书馆的用户隐藏了 Word 和 Pdf 文档存在的事实。当您决定添加更多文档类型(例如 Rtf、Html 等)时,这一点变得尤为重要:用户无需重新编译代码即可从新添加的类型中受益。事实上,他们甚至不会注意到您已经更改了任何内容:如果操作正确,他们的代码将“正常”处理他们从未知道存在的类型的文档。

PS 如果您可以扫描字节数组并从中找出正确的类型,则您的 API 可以通过消除第二个参数来“为风格赢得一些分数”。

于 2012-07-02T16:09:38.760 回答
3

如果派生类型不添加任何属性/方法,并且您具有确定给定字节 [] 使用哪种类型的技术能力,我什至不会公开派生类......它们只会增加消费者在学习你的图书馆时必须解析的东西。只需要像public static Document OpenDocument(byte[] data)Document 类中那样的静态工厂方法。

于 2012-07-02T16:10:34.737 回答