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

工厂方法模式为何需单独对象创建接口?直接new子类不行吗?

工厂方法模式:为何要单独定义工厂接口而非直接new子类?

我正在学习设计模式,在一份Java实现的工厂方法模式示例里产生了核心疑问:为何工厂方法模式需要为子类的对象创建单独定义接口?为何不能直接使用new关键字实例化子类?

示例实现代码

public interface Shape {
    void draw();
}

public class Square implements Shape {
    public void draw() {
        System.out.println("Drawing a Square");
    }
}

public class Circle implements Shape {
    public void draw() {
        System.out.println("Drawing a Circle");
    }
}

public interface ShapeFactory {
    Shape createShape();
}

public class SquareFactory implements ShapeFactory {
    public Shape createShape() {
        return new Square();
    }
}

public class CircleFactory implements ShapeFactory {
    public Shape createShape() {
        return new Circle();
    }
}

public class Main {
    public static void main(String[] args) {
        ShapeFactory squareFactory = new SquareFactory();
        Shape square = squareFactory.createShape();
        square.draw();

        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();
    }
}

我为何不能直接采用如下简化写法?

public class Main {
    public static void main(String[] args) {
        Shape square = new Square();
        Shape circle = new Circle();
    }
}

核心原因解析

  • 封装对象创建的复杂性
    示例里的Square、Circle创建逻辑很简单,但实际项目中,对象创建可能要做初始化参数、加载配置、依赖注入等操作。如果直接用new,这些逻辑会分散在所有调用点,后续修改时要一个个找;用工厂接口的话,所有创建逻辑都集中在Factory类里,改一处就能生效。

  • 解耦对象创建与使用逻辑
    调用方(Main类)只依赖ShapeFactory和Shape接口,完全不知道具体是Square还是Circle。哪天要新增Triangle形状,只需要加Triangle类和TriangleFactory类,Main的代码不用动——这完全符合开闭原则。要是直接new,每次加新形状都得修改调用方代码,把使用逻辑和具体实现绑死了。

  • 统一对象创建的规范
    ShapeFactory定义了createShape()这个统一的创建契约,所有工厂子类都得遵循。不管创建哪种形状,调用方都用同样的方式获取实例,不用记不同子类的构造参数、初始化流程,降低了使用成本。

  • 支持动态对象创建
    如果需要根据运行时条件(比如配置文件、用户输入)决定创建哪个对象,工厂模式的优势就凸显了。比如可以写一个工厂选择方法:

    public static ShapeFactory getFactory(String shapeType) {
        return switch(shapeType) {
            case "square" -> new SquareFactory();
            case "circle" -> new CircleFactory();
            default -> null;
        };
    }
    

    调用方只需要传参数就能拿到对应工厂,不用自己写一堆if-else判断。要是直接new,这些判断逻辑会和业务代码混在一起,越写越乱。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:07:14