Java 21中同结构异字段值的通知对象最优创建方案咨询
通知消息构建方案的优化分析
你的当前方案本身是可行的,但当通知类型增多时,工厂类会逐渐臃肿,维护成本上升。可以针对逻辑内聚性和扩展性做进一步优化,核心是把每种通知的构建逻辑从工厂类中抽离,实现单一职责。
核心问题拆解
你提到“工厂模式通常用于创建子类”是传统场景的常见用法,但你的场景是同一数据结构下的不同业务规则,本质是要把不同的构建逻辑解耦,而非创建不同的子类。
优化方案建议
1. 策略模式替代单一工厂
将每种通知的构建逻辑封装成独立策略类,工厂类仅负责分发逻辑:
首先定义策略接口:
interface NotificationStrategy { Notification create(Context context); }
实现各类型的策略类:
class GenericNotificationStrategy implements NotificationStrategy { @Override public Notification create(Context context) { // Generic通知的动态计算逻辑 String title = "通用通知:" + context.getUserName(); String body = "欢迎访问" + context.getCurrentPage(); return new Notification(title, body); } } class AlertNotificationStrategy implements NotificationStrategy { @Override public Notification create(Context context) { // Alert通知的专属逻辑 String title = "警告:" + context.getAlertLevel(); String body = "您的" + context.getCurrentPage() + "存在风险"; return new Notification(title, body); } } class OfferNotificationStrategy implements NotificationStrategy { @Override public Notification create(Context context) { // Offer通知的专属逻辑 String title = "专属优惠:" + context.getUserGrade(); String body = "在" + context.getCurrentPage() + "下单立减50元"; return new Notification(title, body); } }
改造工厂类,用映射替代switch分支:
final class NotificationFactory { private static final Map<NotificationType, NotificationStrategy> STRATEGY_MAP = Map.of( NotificationType.GENERIC, new GenericNotificationStrategy(), NotificationType.ALERT, new AlertNotificationStrategy(), NotificationType.OFFER, new OfferNotificationStrategy() ); Notification create(Context context, NotificationType type) { return STRATEGY_MAP.get(type).create(context); } }
2. 枚举嵌入逻辑的简化实现(Java 8+)
如果不想创建过多类,可以利用枚举的多态特性,把构建逻辑直接嵌入枚举:
enum NotificationType { GENERIC { @Override public Notification create(Context context) { // Generic构建逻辑 return new Notification("通用通知", "欢迎回来"); } }, ALERT { @Override public Notification create(Context context) { // Alert构建逻辑 return new Notification("警告通知", "请注意风险"); } }, OFFER { @Override public Notification create(Context context) { // Offer构建逻辑 return new Notification("优惠通知", "专属折扣已到账"); } }; public abstract Notification create(Context context); }
使用时直接调用枚举方法即可:
Notification notification = NotificationType.GENERIC.create(context);
方案对比
- 原方案:简单直接,但类型增多后工厂类会变成“上帝类”,违反单一职责原则。
- 策略模式:逻辑完全解耦,新增类型只需添加策略类,适合类型多、逻辑复杂的场景。
- 枚举嵌入:代码紧凑,无需额外类,适合类型数量可控、逻辑相对简单的场景。
总结
你的初始方案没有“遗漏”关键内容,只是可以根据未来的扩展需求选择更具扩展性的实现。如果当前类型少、逻辑简单,原方案完全够用;如果后续会新增大量通知类型,策略模式或枚举多态的方式会更易维护。
内容的提问来源于stack exchange,提问作者rossilor95
相关产品推荐
相关产品推荐

