我多次遇到过这种情况,但我找不到管理它的最佳方法的明确答案。
问题来了。我有一个 Java 21 后端应用程序,它为 React 应用程序提供数据。前端应该显示几种不同类型的通知消息。这些消息是在服务器端构建的。
在实际场景中,我可能有很多不同类型的通知消息。然而,为了简单起见,我们假设只有 3 个:
通知消息都具有相同的结构,它们有标题和正文。每个通知类型都是根据当前用户和当前页面动态计算的,并且需要构建单独的逻辑。
我考虑使用记录对通知进行建模:
record Notification(String title, String body) {}
然后,我使用了一个简单的工厂模式来管理他们的创建
enum NotificationType {
GENERIC, ALERT, OFFER
}
final class NotificationFactory {
Message create(Context context) {
return switch {
case GENERIC -> createGenericMessage(context);
case ALERT -> createAlertMessage(context);
case OFFER -> createOfferMessage(context);
}
}
// implementations of private methods
}
但是,我并不 100% 相信这是最好的方法,而且我通常会看到工厂模式与同一类型的不同子类相关联。但是,在这种情况下,通知类型和其他通知类型之间的唯一区别是其字段的值以及检索这些值的方式。
我错过了什么?先谢谢你了
就我个人而言,在这个例子中,我会使用枚举抽象方法“create”。
您正在删除开关,因此当添加新的通知元素时,有人会立即看到他们需要实现创建方法,并且无需更改该开关。
基本上,您在枚举中创建抽象方法,然后每个枚举值都需要实现该方法,因此您有类似的东西:
enum NotificationType {
GENERIC_NOTIFICATION {
@Override
public Notification create(Object context) {
return null;
}
},
ALERT_NOTIFICATION {
@Override
public Notification create(Object context) {
return null;
}
},
OFFER_NOTIFICATION {
@Override
public Notification create(Object context) {
return null;
}
};
public abstract Notification create(Object context);
}
@Test
public void testSth() {
NotificationType type = NotificationType.ALERT_NOTIFICATION; // I assumed that you know the type beforehand
Object context = null; // your context, probably different type than Object
type.create(context);
}
从你实现的方法中,你应该根据你的需要调用一些静态工厂或其他东西。
您还可以创建更多方法,具体取决于用例。
这种方法的唯一缺点是您需要传递所需的所有内容或调用数据库方法来检索信息。 所以取决于你的应用程序结构看起来如何,它可能是好是坏。 如果您有一些由框架管理的全局会话对象,并且您可以在会话范围级别上的任何位置访问它们,并且您需要很多它们,那么每次都将其传递给我们可能会很麻烦。
但抛开这一点,我个人喜欢这种方法是有原因的。如果我有很多类型并且在很多地方使用它们,那么在添加新类型时,我只需要实现一些方法,每个方法都有不同的实现,并且我不需要检查枚举的每个引用哪里有开关盒可以到处添加新的开关盒。
另外,我不确定是否对所有情况都有明确的好处来回答您的问题:)