工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化延迟到子类。通过工厂方法模式,我们可以在不修改现有代码的情况下引入新的产品类,从而实现更好的扩展性和可维护性。
让我们通过一个简单的示例来理解工厂模式。假设我们需要创建不同类型的形状对象,比如圆形(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();
- }
- }
工厂模式通过定义创建对象的接口,将对象的实例化延迟到子类,从而实现了解耦和扩展性。尽管其结构相对复杂,但在需要灵活创建对象且可能频繁变更的场景中,工厂模式是一种非常有用的设计模式。希望通过这个示例,你能更好地理解和应用工厂模式,让你的代码更加优雅和高效。