简单工厂模式和工厂方法模式是面向对象设计中的两种常见的设计模式,它们都属于创建型模式,主要用于解决对象的创建问题,使得代码更加灵活,易于扩展。这两种模式在软件开发中有着广泛的应用,尤其是在需要根据不同的条件创建不同类型的对象时。
**简单工厂模式**
简单工厂模式是一种静态工厂方法,它提供一个公共的工厂类来创建对象,这个工厂类通常有一个静态方法,根据传入的参数来决定创建哪种类型的实例。这种模式的主要优点在于客户端无需知道具体的产品实现,只需要知道产品接口即可。然而,它的缺点也很明显,当产品类型增加时,工厂类需要进行修改,违反了“开闭原则”。
例如,假设我们有一个简单的形状类层次结构,包括圆形、正方形和矩形。在简单工厂模式下,我们可以创建一个`ShapeFactory`类,其中包含一个静态方法`createShape`,根据传入的形状类型(如"Circle"、"Square"或"Rectangle")返回对应的形状对象。
```java
public class ShapeFactory {
public static Shape createShape(String type) {
if ("Circle".equals(type)) {
return new Circle();
} else if ("Square".equals(type)) {
return new Square();
} else if ("Rectangle".equals(type)) {
return new Rectangle();
}
// 其他错误处理
}
}
```
**工厂方法模式**
相比于简单工厂模式,工厂方法模式将对象的创建延迟到了子类,实现了进一步的解耦。在工厂方法模式中,抽象工厂定义了一个创建对象的接口,但不直接实例化对象,而是由具体的工厂子类来决定实例化哪个产品类。这种方式允许我们在不修改已有代码的情况下,通过添加新的工厂子类来支持新的产品类型,符合“开闭原则”。
回到形状的例子,我们可以创建一个抽象的`ShapeFactory`类,其中定义了一个抽象的`createShape`方法。然后为每种形状创建一个具体的工厂子类(如`CircleFactory`、`SquareFactory`和`RectangleFactory`),每个子类实现自己的`createShape`方法来创建对应形状的对象。
```java
public abstract class ShapeFactory {
public abstract Shape createShape();
}
public class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
// 类似地,为其他形状创建工厂子类
```
**两者的对比**
1. **灵活性**:工厂方法模式更灵活,因为它允许在运行时创建对象,而简单工厂模式是在编译时决定的。
2. **扩展性**:工厂方法模式更易于扩展,因为添加新产品只需要添加新的工厂子类,而简单工厂模式需要修改工厂类。
3. **开闭原则**:工厂方法模式遵循“开闭原则”,对扩展开放,对修改关闭;简单工厂模式则可能需要修改原有代码以适应新产品的添加。
在实际开发中,如果产品类型相对固定,简单工厂模式可以满足需求;但当产品类型可能会频繁扩展时,选择工厂方法模式更为合适。同时,结合源码分析工具,我们可以更好地理解和学习这两种模式在实际项目中的应用。