深入解析工厂模式:三种类型及其应用场景
深入解析工厂模式:三种类型及其应用场景
在软件设计中,工厂模式是一种创建型设计模式,它提供了一种将对象创建的逻辑与使用对象的逻辑分离的方法。工厂模式主要分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。本文将详细介绍这三种工厂模式的特点、应用场景以及它们在实际开发中的应用。
1. 简单工厂模式(Simple Factory Pattern)
简单工厂模式又称静态工厂方法模式,它不属于GOF(Gang of Four)设计模式的23种经典模式之一,但它是工厂模式的基础。简单工厂模式通过一个工厂类来创建对象,根据传入的参数决定创建哪一种产品类的实例。
应用场景:
- 当需要创建的对象较少且业务逻辑简单时。
- 当客户端不需要知道创建对象的细节时。
示例: 假设我们有一个图形绘制程序,需要绘制不同类型的图形(如圆形、矩形、三角形)。我们可以使用简单工厂模式来创建这些图形对象。
public class ShapeFactory {
public static Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("TRIANGLE")) {
return new Triangle();
}
return null;
}
}
2. 工厂方法模式(Factory Method Pattern)
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类中。
应用场景:
- 当一个类不知道它所必须创建的对象的类时。
- 当一个类希望由它的子类来指定它所创建的对象时。
示例: 在上面的图形绘制程序中,如果我们希望每个图形都有自己的工厂类来创建,那么可以使用工厂方法模式。
public abstract class ShapeFactory {
public abstract Shape createShape();
}
public class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
public class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
3. 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。它是工厂方法模式的进一步抽象和扩展。
应用场景:
- 当系统需要独立于其产品的创建、组合和表示时。
- 当系统需要支持多种产品系列时。
示例: 假设我们不仅需要绘制图形,还需要为这些图形提供不同的颜色和填充方式。我们可以使用抽象工厂模式来创建这些产品系列。
public interface Color {
void fill();
}
public interface Shape {
void draw();
}
public interface AbstractFactory {
Color getColor(String color);
Shape getShape(String shape);
}
public class ColorFactory implements AbstractFactory {
@Override
public Color getColor(String color) {
if (color == null) {
return null;
}
if (color.equalsIgnoreCase("RED")) {
return new Red();
} else if (color.equalsIgnoreCase("GREEN")) {
return new Green();
}
return null;
}
@Override
public Shape getShape(String shape) {
return null;
}
}
public class ShapeFactory implements AbstractFactory {
@Override
public Color getColor(String color) {
return null;
}
@Override
public Shape getShape(String shape) {
if (shape == null) {
return null;
}
if (shape.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shape.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
}
总结
工厂模式通过将对象的创建过程封装起来,降低了系统的耦合度,提高了系统的灵活性和可维护性。简单工厂模式适用于创建对象较少且业务逻辑简单的场景;工厂方法模式适用于需要子类决定实例化哪一个类的情况;抽象工厂模式则适用于需要创建一系列相关或依赖对象的场景。在实际开发中,根据具体需求选择合适的工厂模式,可以有效地管理对象的创建和使用,提升代码的可读性和可扩展性。