工厂方法模式(Java)
工厂方法模式概述
1. 工厂方法模式的定义
工厂方法模式提供了一种创建对象的方式,而无需指定具体的类。它通过定义一个接口来创建对象,具体的实例化过程由子类实现。这种方式使得代码更加灵活,易于扩展。
2. 工厂方法模式的结构
工厂方法模式主要包含以下几个角色:
- 抽象产品(Abstract Product):定义产品的共同接口。
- 具体产品(Concrete Product):实现了抽象产品接口,定义具体产品的特定行为。
- 抽象工厂(Abstract Factory):声明创建产品的抽象方法。
- 具体工厂(Concrete Factory):实现抽象工厂接口,负责实际创建具体产品的对象。
工厂方法模式的实例分析
为了更好地理解工厂方法模式,我们将通过一个简单的示例来说明。假设我们需要创建一个图形绘制程序,支持绘制不同形状的图形。
步骤 1:定义抽象产品接口
java">public interface Shape {void draw();
}
在这个接口中,我们定义了一个 draw
方法,所有具体形状类都需要实现这个方法。
步骤 2:实现具体产品类
java">public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}
在这些具体产品类中,我们实现了 Shape
接口的 draw
方法,分别输出不同的形状信息。
步骤 3:定义抽象工厂
java">public abstract class ShapeFactory {public abstract Shape getShape(String shapeType);
}
这里我们定义了一个抽象工厂类 ShapeFactory
,它声明了一个抽象方法 getShape
,用于根据形状类型返回相应的形状对象。
步骤 4:实现具体工厂
java">public class ConcreteShapeFactory extends ShapeFactory {@Overridepublic 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:使用工厂
java">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:定义学生抽象类
java">public abstract class Student {protected String name;public Student(String name) {this.name = name;}public abstract void displayInfo();
}
步骤 2:实现具体学生类
java">public class Undergraduate extends Student {public Undergraduate(String name) {super(name);}@Overridepublic void displayInfo() {System.out.println("Undergraduate Student: " + name);}
}public class Graduate extends Student {public Graduate(String name) {super(name);}@Overridepublic void displayInfo() {System.out.println("Graduate Student: " + name);}
}
步骤 3:定义学生工厂
java">public abstract class StudentFactory {public abstract Student createStudent(String name);
}
步骤 4:实现具体学生工厂
java">public class ConcreteStudentFactory extends StudentFactory {@Overridepublic 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:使用学生工厂
java">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();}
}