我目前正在使用此处定义的构建器模式:
我现在遇到的问题是需要创建以下结构:
- ZipHolder: file metadata present
* File mainFile
* File optionalFile
* List<File> files
或者:
- ZipHolder: no file metadata present
* File mainFile
* File optionalFile
* List<File> files
两者ZipHolder
和File
都是使用构建器模式构造的,实现为每个的内部静态类。AZipHolder
将 amainFile
作为强制的构造函数参数,并在 中预填充一些信息ZipHolder
,如果需要,可以覆盖这些信息。AFile
包含文件内容和与该文件有关的相关元数据。ZipHolder
然后File
在调用build()
每个Builder
类的方法时对两者进行验证。然后获取对象并将其输出到 ZIP 文件层次结构,如果需要,该层次结构随后应读入相同的对象结构。
这很好地工作,并在确保不变性的同时为对象创建提供了一定程度的灵活性。虽然我遇到了一个问题。提出了一个新要求,要求File
对象可以具有元数据和文件内容,也可以只有文件 内容。我想我可以简单地将一个布尔标志值传递给对象的构建器,以允许跳过通常的元数据验证。这看起来没问题,但它需要构建一个mainFile - 本质上是一个先有鸡还是先有蛋的情况。我的下一个想法是将旗帜移到课堂上。这似乎没问题,直到我意识到您可能会创建多个ZipHolder
File
File
File
对象,有些需要元数据,有些只需要文件内容,无法全面实施约束。
所以我对如何进行有些困惑。我看不到以优雅的方式将mainFile的需求解耦的明显方法。ZipHolder
我想到了抽象类、接口、基类之类的概念,但在这种特殊情况下我需要一些指导。
所以我的问题是:
根据上面链接中的原因,我可以在保留构建器模式的同时允许这两种情况吗?