You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

三级继承类实例化选择:能否使用工厂方法与工厂模式?

当然可以!针对你这种三级继承的实体类场景,不管是工厂方法(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,不需要知道BC的具体创建逻辑,降低了代码耦合度
  • 易于扩展:如果后续新增一个继承自C的类D,只需要在工厂方法里加个分支(或新增一个DFactory),完全不用修改原有实体类的代码
  • 统一管理创建逻辑:所有实例化的逻辑都集中在工厂里,后续如果要修改实体的创建规则(比如加初始化参数),只需要改工厂代码就行

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

火山引擎 最新活动