You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:26:37