三级继承类实例化选择:能否使用工厂方法与工厂模式?
当然可以!针对你这种三级继承的实体类场景,不管是工厂方法(Factory Method)还是广义上的工厂模式,都能完美帮你实现动态选择实例化类的需求。下面我给你拆解具体的实现思路和代码示例,让你一看就懂。
1. 先明确你的类结构
首先把你的继承关系用代码具象化,方便后续讲解:
// 基类A class A { // 实体类的属性和通用方法 public void doSomething() { System.out.println("A doing something"); } } // 子类B继承自A class B extends A { @Override public void doSomething() { System.out.println("B doing something"); } } // 子类C继承自B class C extends B { @Override public void doSomething() { System.out.println("C doing something"); } }
2. 用工厂方法(Factory Method)实现
工厂方法的核心思想是把对象的创建逻辑封装起来,让调用方只需要关心结果而不用管创建细节。这里分两种常见实现方式:
2.1 参数化工厂方法(最贴合你“一个方法选择”的需求)
这种方式是在一个工厂类里提供一个方法,通过传入参数(比如字符串、枚举)来决定实例化哪个类:
class EntityFactory { // 传入类型标识,返回对应的实例 public A createEntity(String entityType) { switch(entityType) { case "A": return new A(); case "B": return new B(); case "C": return new C(); default: throw new IllegalArgumentException("不支持的实体类型:" + entityType); } } }
使用示例
调用的时候只需要传个参数就行,非常简洁:
public class Main { public static void main(String[] args) { EntityFactory factory = new EntityFactory(); A entityA = factory.createEntity("A"); entityA.doSomething(); // 输出:A doing something A entityC = factory.createEntity("C"); entityC.doSomething(); // 输出:C doing something } }
2.2 纯GoF定义的工厂方法模式
如果你想严格遵循GoF的工厂方法定义(抽象工厂接口+具体工厂实现),可以给每个实体类对应一个具体工厂:
// 抽象工厂接口,定义创建实体的方法 interface EntityFactory { A createEntity(); } // 专门创建A的工厂 class AFactory implements EntityFactory { @Override public A createEntity() { return new A(); } } // 专门创建B的工厂 class BFactory implements EntityFactory { @Override public A createEntity() { return new B(); } } // 专门创建C的工厂 class CFactory implements EntityFactory { @Override public A createEntity() { return new C(); } }
使用示例
这种方式适合后续扩展新实体类时,不需要修改原有工厂代码,只需要新增对应工厂即可:
public class Main { public static void main(String[] args) { // 选择要使用的工厂,就能得到对应的实体 EntityFactory factory = new CFactory(); A entityC = factory.createEntity(); entityC.doSomething(); // 输出:C doing something } }
3. 为什么这种方案适合你的场景?
- 解耦创建与使用:调用方只需要依赖基类
A,不需要知道B、C的具体创建逻辑,降低了代码耦合度 - 易于扩展:如果后续新增一个继承自
C的类D,只需要在工厂方法里加个分支(或新增一个DFactory),完全不用修改原有实体类的代码 - 统一管理创建逻辑:所有实例化的逻辑都集中在工厂里,后续如果要修改实体的创建规则(比如加初始化参数),只需要改工厂代码就行
内容的提问来源于stack exchange,提问作者Marco




