什么是工厂模式?
工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化延迟到子类。通过工厂方法模式,我们可以在不修改现有代码的情况下引入新的产品类,从而实现更好的扩展性和可维护性。
示例:创建不同类型的形状对象
让我们通过一个简单的示例来理解工厂模式。假设我们需要创建不同类型的形状对象,比如圆形(Circle)、矩形(Rectangle)和正方形(Square)。
第一步:定义形状接口
首先,我们定义一个形状接口(Shape),所有具体的形状类都实现这个接口。
public interface Shape {
void draw();
}
第二步:创建具体的形状类
接下来,我们创建实现 Shape
接口的具体形状类,例如 Circle
、Rectangle
和 Square
。
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Rectangle");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Square");
}
}
第三步:创建抽象工厂类
我们创建一个抽象工厂类(ShapeFactory),定义一个工厂方法 createShape
,由子类实现具体的创建逻辑。
public abstract class ShapeFactory {
public abstract Shape createShape();
}
第四步:创建具体工厂类
然后,我们为每种形状创建对应的工厂类,实现工厂方法 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();
}
}
public class SquareFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Square();
}
}
第五步:使用工厂类创建形状对象
最后,我们在客户端代码中使用具体的工厂类来创建不同的形状对象。
public class Client {
public static void main(String[] args) {
ShapeFactory circleFactory = new CircleFactory();
Shape shape1 = circleFactory.createShape();
shape1.draw();
ShapeFactory rectangleFactory = new RectangleFactory();
Shape shape2 = rectangleFactory.createShape();
shape2.draw();
ShapeFactory squareFactory = new SquareFactory();
Shape shape3 = squareFactory.createShape();
shape3.draw();
}
}
工厂模式的优点
- 解耦:工厂模式将对象的创建和使用解耦,客户端代码不需要知道具体类名,只需与工厂类和接口/抽象类交互。
- 扩展性:添加新类型的产品类时,只需增加相应的具体工厂类,无需修改现有代码,符合开闭原则(Open/Closed Principle)。
- 灵活性:通过工厂方法的重载或重写,可以灵活地控制对象创建的过程。
工厂模式的缺点
- 类的数量增加:每增加一种产品类,都需要增加相应的具体工厂类,导致类的数量增加。
- 复杂性:相对于简单工厂模式,工厂模式的结构更复杂,需要额外定义工厂类。
总结
工厂模式通过定义创建对象的接口,将对象的实例化延迟到子类,从而实现了解耦和扩展性。尽管其结构相对复杂,但在需要灵活创建对象且可能频繁变更的场景中,工厂模式是一种非常有用的设计模式。希望通过这个示例,你能更好地理解和应用工厂模式,让你的代码更加优雅和高效。