工厂方法模式(Factory Method Pattern) 是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使得类的实例化推迟到子类中进行,从而达到解耦的目的。工厂方法模式的核心思想是把实例化对象的工作交给子类,而不是由客户端代码直接控制,这样可以使得代码更加灵活和可扩展。
工厂方法模式适用于以下情况:
new关键字来实例化对象,以便将实例化的责任推迟到子类中时。工厂方法模式包含以下几个角色:
Product接口的具体类,代表具体的产品。Product对象的接口。Creator中的工厂方法,负责实例化具体的产品对象。 +----------------+
| Creator | <-- Abstract Factory (工厂)
+----------------+
| + factoryMethod()| --> 工厂方法接口
+----------------+
^
|
+------------------+
| ConcreteCreator | <-- 具体工厂
+------------------+
| + factoryMethod() |
+------------------+
^
|
+-------------+
| Product | <-- 产品接口
+-------------+
| + doSomething() |
+-------------+
^
|
+-------------------+
| ConcreteProduct | <-- 具体产品
+-------------------+
| + doSomething() |
+-------------------+假设我们有一个图形(Shape)接口,具体的图形类有圆形(Circle)和矩形(Rectangle)。我们希望通过工厂方法来创建这些图形对象,而不是直接在代码中用new来实例化它们。
// 产品接口:Shape
public interface Shape {
void draw(); // 产品的具体方法
}2. 具体产品类(ConcreteProduct)
// 具体产品1:Circle
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing Circle");
}
}
// 具体产品2:Rectangle
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing Rectangle");
}
}3. 工厂接口(Creator)
// 工厂接口:Creator
public abstract class ShapeFactory {
// 工厂方法:返回一个Shape类型的对象
public abstract Shape createShape();
}4. 具体工厂类(ConcreteCreator)
// 具体工厂1:CircleFactory
public class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle(); // 返回一个Circle对象
}
}
// 具体工厂2:RectangleFactory
public class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle(); // 返回一个Rectangle对象
}
}5. 客户端代码(Client)
public class Client {
public static void main(String[] args) {
// 使用工厂来创建对象,而不是直接new
ShapeFactory circleFactory = new CircleFactory();
Shape circle = circleFactory.createShape();
circle.draw(); // 输出:Drawing Circle
ShapeFactory rectangleFactory = new RectangleFactory();
Shape rectangle = rectangleFactory.createShape();
rectangle.draw(); // 输出:Drawing Rectangle
}
}5. 运行结果
Drawing Circle
Drawing Rectangle简单工厂模式(Simple Factory Pattern)和工厂方法模式有一定的相似性,都用于创建对象,但两者有以下区别:
工厂方法模式通过简单的接口和抽象化的工厂类实现了灵活的对象创建方式,尤其适用于系统需要扩展或更换产品类型的场景。
如果您有任何问题或建议,欢迎留言讨论。