工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
关键点
- 工厂方法:定义一个创建对象的接口,但由子类决定具体实例化的类。
- 抽象产品:定义产品的公共接口或抽象类。
- 具体产品:实现抽象产品接口或继承抽象产品类的具体产品类。
- 抽象工厂:定义工厂方法以创建抽象产品。
- 具体工厂:实现工厂方法以创建具体产品。
优点
- 遵循开闭原则:增加新产品时,只需要增加新的具体工厂和具体产品类,不需要修改已有代码。
- 解耦产品的创建与使用:客户端通过抽象工厂接口来创建产品,不需要知道具体产品的类名。
缺点
- 类的数量增加:每增加一种产品,都需要增加相应的具体产品类和具体工厂类。
代码实现
场景
假设我们要设计一个图形绘制程序,需要支持创建不同类型的形状(如圆形、矩形和三角形)。我们使用工厂方法模式来实现这一需求。
代码结构
-
Shape:抽象产品类。
-
Circle、Rectangle、Triangle:具体产品类。
-
ShapeFactory:抽象工厂类。
-
CircleFactory、RectangleFactory、TriangleFactory:具体工厂类。
-
Main:测试类,演示工厂方法模式的使用。
-
Shape.java:抽象产品类。
public interface Shape { void draw(); }
-
Circle.java:具体产品类,表示圆形。
public class Circle implements Shape { @Override public void draw() { System.out.println("Drawing a Circle"); } }
-
Rectangle.java:具体产品类,表示矩形。
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Drawing a Rectangle"); } }
-
Triangle.java:具体产品类,表示三角形。
public class Triangle implements Shape { @Override public void draw() { System.out.println("Drawing a Triangle"); } }
-
ShapeFactory.java:抽象工厂类。
public abstract class ShapeFactory { // 工厂方法,子类实现以创建具体产品 public abstract Shape createShape(); }
-
CircleFactory.java:具体工厂类,负责创建圆形。
public class CircleFactory extends ShapeFactory { @Override public Shape createShape() { return new Circle(); } }
-
RectangleFactory.java:具体工厂类,负责创建矩形。
public class RectangleFactory extends ShapeFactory { @Override public Shape createShape() { return new Rectangle(); } }
-
TriangleFactory.java:具体工厂类,负责创建三角形。
public class TriangleFactory extends ShapeFactory { @Override public Shape createShape() { return new Triangle(); } }
-
Main.java:测试类,演示工厂方法模式的使用。
public class Main { public static void main(String[] args) { // 使用具体工厂创建不同类型的形状 ShapeFactory circleFactory = new CircleFactory(); ShapeFactory rectangleFactory = new RectangleFactory(); ShapeFactory triangleFactory = new TriangleFactory(); Shape circle = circleFactory.createShape(); Shape rectangle = rectangleFactory.createShape(); Shape triangle = triangleFactory.createShape(); // 绘制形状 circle.draw(); rectangle.draw(); triangle.draw(); } }