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

使用Factory Pattern时是否需返回所有实现抽象类的对应实体类对象?

// 整理后可正常阅读的伪代码逻辑
abstract class X {
    abstract void y();
}

class A extends X {
    @Override
    void y() {
        // A类独立业务逻辑
    }
}

class B extends X {
    @Override
    void y() {
        // 原伪代码此处存在语法问题,实际意图应为通过工厂获取实例调用y方法
        new Factory().determineClass(input).y();
    }
}

class Factory {
    X determineClass(String input) {
        if("a".equals(input)) {
            return new A();
        }
        return null;
    }
}

问题1解答

  • 如果业务场景明确需要工厂对外提供B类型的X实例,必须补充input == 'b'时返回new B()的判断分支,否则工厂遇到input='b'时会返回null,后续调用y()方法会直接触发空指针异常。
  • 注意补充分支的前提是先修正B类的错误实现:当前B类的y()方法如果按意图实现为工厂返回实例调用y(),一旦工厂返回B实例,会直接触发无限递归调用,最终导致栈溢出崩溃。

问题2解答

你的判断完全正确,B类不应该继承X类:

  • 职责不匹配:X是抽象业务规范,子类应当是具体的业务实现类,各自实现独立的y()逻辑;而B类的作用是调度工厂、转发调用,属于高层调度层逻辑,和X子类的职责完全不属于同一层级。
  • 违反里氏替换原则:如果B继承X,所有需要传入X实例的场景理论上都可以用B实例替换,但替换后行为会变为走工厂调度,和普通X实现类的逻辑完全不一致,会引发不可预期的业务错误。
  • 存在递归风险:正如问题1提到的,B继承X会导致工厂返回B实例时触发无限递归的致命问题。

内容的提问来源于stack exchange,提问作者SaCh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:57:04