我最近编写了一个类库,其中包含一些对某些类型的文件建模的对象。例如,有一个抽象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
注意,派生类型不添加额外的属性/方法抽象类,他们只是以不同方式实现的抽象方法。
绝对是第二个选项。允许将来更容易扩展,并且意味着当添加新的更适合的类型时,人们花更少的时间更新类声明。 –
'Document'类是否具有最终用户需要处理给定'Document'的所有内容,还是偶尔(或经常)需要访问特定于更多派生类型的功能? – Servy
@Servy是的,'Document'类有一个公共抽象方法。所有派生类只包含受保护的和私有的帮助方法(加上重写的公共方法),其唯一目的是实现一个公共方法。 – Andrew