工厂方法模式为何需单独对象创建接口?直接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
相关产品推荐
相关产品推荐

