当具体实现具有不同的可能属性时使用构建器模式

Using a builder pattern when concrete implementations have different possible properties

我目前正在为用于 2 种预订的预订系统设计域。

这两种类型都有共同的属性,例如它们的日期和位置。不过,两者也都具有对方所没有的属性。这里的示例是您可以带客人一起来的一种类型,而不是另一种类型;或者您可以要求一种午餐,而不是另一种。

目前我有一个抽象的预订 class,每个预订类型都有一个具体的实现。然后我有一个 ReservationBuilder,它将枚举(保留类型)作为其构造函数中的参数。然后,此构建器将包含两种类型的预订的方法,并且使用一种无​​法使用信息的预订类型的方法将在构建时不执行任何操作,或者引发错误。

但有些事情告诉我,这不是该模式的好用法。将构建器也抽象化会更好吗?还是工厂模式更适合我的用例?

您已确定需要抽象超级class,Reservation。您还确定了儿童 classes 的专业化需求,例如 GroupReservationRoomServiceReservation.

使用构建器或工厂模式的动机是什么?如果问题是在给定字符串的情况下创建 class 的新实例,一些 if 语句或 case 语句就可以正常工作。

if(userSelection.equals("group")) {
    return new GroupReservation();
}

如果动机是为了更复杂的事情,建筑商或工厂 class 可能会有用。选择和实例化具体 class 的杂乱细节可以通过这种方式隐藏。

面向对象的程序员可能会不知不觉地戴上“模式护目镜”。当我们佩戴图案护目镜时,我们会处理每一个设计选择,以寻找合适的图案来实施。有时我们可以使用一种语言特性来消除对模式的需要。有时 if 语句就足够了。