使用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
相关产品推荐
相关产品推荐

