工厂方法模式(Java)

182 阅读3分钟

工厂方法模式(Java)

工厂方法模式概述

1. 工厂方法模式的定义

工厂方法模式提供了一种创建对象的方式,而无需指定具体的类。它通过定义一个接口来创建对象,具体的实例化过程由子类实现。这种方式使得代码更加灵活,易于扩展。

2. 工厂方法模式的结构

工厂方法模式主要包含以下几个角色:

  • 抽象产品(Abstract Product):定义产品的共同接口。
  • 具体产品(Concrete Product):实现了抽象产品接口,定义具体产品的特定行为。
  • 抽象工厂(Abstract Factory):声明创建产品的抽象方法。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,负责实际创建具体产品的对象。

工厂方法模式的实例分析

为了更好地理解工厂方法模式,我们将通过一个简单的示例来说明。假设我们需要创建一个图形绘制程序,支持绘制不同形状的图形。

步骤 1:定义抽象产品接口

public interface Shape {
    void draw();
}

在这个接口中,我们定义了一个 draw 方法,所有具体形状类都需要实现这个方法。

步骤 2:实现具体产品类

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

在这些具体产品类中,我们实现了 Shape 接口的 draw 方法,分别输出不同的形状信息。

步骤 3:定义抽象工厂

public abstract class ShapeFactory {
    public abstract Shape getShape(String shapeType);
}

这里我们定义了一个抽象工厂类 ShapeFactory,它声明了一个抽象方法 getShape,用于根据形状类型返回相应的形状对象。

步骤 4:实现具体工厂

public class ConcreteShapeFactory extends ShapeFactory {
    @Override
    public 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("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

在具体工厂类 ConcreteShapeFactory 中,我们实现了 getShape 方法,根据传入的形状类型返回相应的形状对象。

步骤 5:使用工厂

public class FactoryPatternDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ConcreteShapeFactory();

        Shape shape1 = shapeFactory.getShape("CIRCLE");
        shape1.draw();

        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        shape2.draw();

        Shape shape3 = shapeFactory.getShape("SQUARE");
        shape3.draw();
    }
}

FactoryPatternDemo 类中,我们使用 ConcreteShapeFactory 来获取不同的形状对象,并调用它们的 draw 方法。

学生信息管理系统的实现

接下来,我们将利用工厂方法模式实现一个简单的学生信息管理系统。该系统支持添加不同类型的学生(如本科生和研究生)。

步骤 1:定义学生抽象类

public abstract class Student {
    protected String name;

    public Student(String name) {
        this.name = name;
    }

    public abstract void displayInfo();
}

步骤 2:实现具体学生类

public class Undergraduate extends Student {
    public Undergraduate(String name) {
        super(name);
    }

    @Override
    public void displayInfo() {
        System.out.println("Undergraduate Student: " + name);
    }
}

public class Graduate extends Student {
    public Graduate(String name) {
        super(name);
    }

    @Override
    public void displayInfo() {
        System.out.println("Graduate Student: " + name);
    }
}

步骤 3:定义学生工厂

public abstract class StudentFactory {
    public abstract Student createStudent(String name);
}

步骤 4:实现具体学生工厂

public class ConcreteStudentFactory extends StudentFactory {
    @Override
    public Student createStudent(String type, String name) {
        if (type.equalsIgnoreCase("UNDERGRADUATE")) {
            return new Undergraduate(name);
        } else if (type.equalsIgnoreCase("GRADUATE")) {
            return new Graduate(name);
        }
        return null;
    }
}

步骤 5:使用学生工厂

public class StudentManagementSystem {
    public static void main(String[] args) {
        StudentFactory studentFactory = new ConcreteStudentFactory();

        Student student1 = studentFactory.createStudent("UNDERGRADUATE", "Alice");
        student1.displayInfo();

        Student student2 = studentFactory.createStudent("GRADUATE", "Bob");
        student2.displayInfo();
    }
}