【问题标题】:How can I use the builder pattern to construct various similar object types?如何使用构建器模式来构造各种相似的对象类型?
【发布时间】:2011-12-09 23:19:19
【问题描述】:

我目前正在使用此处定义的构建器模式:

Previous question showing my use of the builder pattern

我现在遇到的问题是需要创建以下结构:

- ZipHolder: file metadata present
    * File mainFile
    * File optionalFile
    * List<File> files

或者:

- ZipHolder: no file metadata present
    * File mainFile
    * File optionalFile
    * List<File> files

ZipHolderFile 都是使用构建器模式构造的,实现为每个的内部静态类。 ZipHoldermainFile 作为强制构造函数参数,并在 ZipHolder 中预填充一些信息,如果需要,可以覆盖这些信息。 File 包含文件内容和与该文件相关的元数据。然后在调用每个Builder 类的build() 方法时对ZipHolderFile 进行验证。然后获取对象并将其输出到 ZIP 文件层次结构中,然后如果需要,该层次结构应读入相同的对象结构。

这很好地工作,并在确保不变性的同时为对象创建提供了一定程度的灵活性。虽然我遇到了一个问题。提出了一项新要求,要求 File 对象可以具有元数据文件内容文件内容。我想我可以简单地将布尔标志值传递给 ZipHolder 对象的构建器,以允许跳过通常的元数据验证。这看起来没问题,但它需要构造一个File mainFile - 本质上是一个先有鸡还是先有蛋的情况。我的下一个想法是将标志移动到File 类。这似乎没问题,直到我意识到您可能会创建多个 File 对象,其中一些需要元数据,而另一些只需要文件内容,无法全面实施约束。

所以我对如何进行有些困惑。我看不到以优雅的方式将ZipHoldermainFile 要求解耦的明显方法。我想到了抽象类、接口、基类之类的概念,但在这种特殊情况下我需要一些指导。

所以我的问题是:

我可以根据上面链接中的原因在保留构建器模式的同时允许这两种情况吗?

【问题讨论】:

    标签: java builder-pattern


    【解决方案1】:

    我不太明白这个问题,但您可能应该创建一个类 MainFile extends File,在那里实现约束并要求用户将 MainFile 实例传递给 ZipHolder 工厂。

    【讨论】:

    • 对不起,我的回复迟了。问题或多或少是需要基类的子类。在我的示例中,子类将具有附加的文件内容。所以我想考虑到每个 File-type 类中都有一个内部静态构建器类,我不太确定如何最好地处理基本上相当于重复工作的事情。我对构建器模式的目标是不变性、使用可选/强制参数轻松构建复杂对象以及验证。所以我想更进一步,使用适合我想要实现的构建器模式。
    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多