工厂方法模式(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();
}
}