工厂方法模式(Factory Method Pattern)是面向对象设计模式中的一种创建型模式。它提供了一种创建对象的最佳实践,将对象的创建与对象的使用分离,从而降低系统的耦合度,提高代码的可扩展性和可维护性。本文将详细解析工厂方法模式,通过图解常见例题及实际应用技巧,帮助读者深入理解这一设计模式。
一、工厂方法模式的基本概念
工厂方法模式的核心思想是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类中进行,从而实现对实例化过程的控制。
1. 抽象工厂(Abstract Factory)
抽象工厂定义了创建对象的接口,但不实现创建对象的具体逻辑。它提供了一个创建对象的方法,该方法返回一个实现了抽象工厂接口的对象。
2. 具体工厂(Concrete Factory)
具体工厂实现了抽象工厂接口,负责创建具体的产品对象。具体工厂可以根据需要创建不同类型的产品对象。
3. 产品(Product)
产品是工厂方法模式中创建的对象,它实现了抽象产品接口。
二、工厂方法模式的图解
以下是一个简单的工厂方法模式图解,用于说明其基本结构:
classDiagram
AbstractFactory <|-- ConcreteFactory1
AbstractFactory <|-- ConcreteFactory2
AbstractProduct <|-- ConcreteProduct1
AbstractProduct <|-- ConcreteProduct2
ConcreteFactory1 o--|{createProduct}: AbstractProduct
ConcreteFactory2 o--|{createProduct}: AbstractProduct
在这个图中,AbstractFactory 是抽象工厂,ConcreteFactory1 和 ConcreteFactory2 是具体工厂,AbstractProduct 是抽象产品,ConcreteProduct1 和 ConcreteProduct2 是具体产品。
三、常见例题解析
1. 题目:请使用工厂方法模式设计一个简单的汽车工厂,实现不同品牌、不同型号的汽车创建。
解答:
// 抽象产品
interface Car {
void drive();
}
// 具体产品1
class FordCar implements Car {
public void drive() {
System.out.println("驾驶福特汽车");
}
}
// 具体产品2
class ToyotaCar implements Car {
public void drive() {
System.out.println("驾驶丰田汽车");
}
}
// 抽象工厂
interface CarFactory {
Car createCar();
}
// 具体工厂1
class FordCarFactory implements CarFactory {
public Car createCar() {
return new FordCar();
}
}
// 具体工厂2
class ToyotaCarFactory implements CarFactory {
public Car createCar() {
return new ToyotaCar();
}
}
// 测试类
public class Test {
public static void main(String[] args) {
CarFactory factory = new FordCarFactory();
Car car = factory.createCar();
car.drive();
}
}
2. 题目:请使用工厂方法模式设计一个图形界面库,支持创建不同类型的图形对象,如圆形、矩形、三角形等。
解答:
// 抽象产品
interface Shape {
void draw();
}
// 具体产品1
class Circle implements Shape {
public void draw() {
System.out.println("绘制圆形");
}
}
// 具体产品2
class Rectangle implements Shape {
public void draw() {
System.out.println("绘制矩形");
}
}
// 具体产品3
class Triangle implements Shape {
public void draw() {
System.out.println("绘制三角形");
}
}
// 抽象工厂
interface ShapeFactory {
Shape createShape();
}
// 具体工厂1
class CircleFactory implements ShapeFactory {
public Shape createShape() {
return new Circle();
}
}
// 具体工厂2
class RectangleFactory implements ShapeFactory {
public Shape createShape() {
return new Rectangle();
}
}
// 具体工厂3
class TriangleFactory implements ShapeFactory {
public Shape createShape() {
return new Triangle();
}
}
// 测试类
public class Test {
public static void main(String[] args) {
ShapeFactory factory = new CircleFactory();
Shape shape = factory.createShape();
shape.draw();
}
}
四、实际应用技巧
选择合适的工厂方法模式场景:当系统需要根据不同条件创建不同类型的产品时,可以考虑使用工厂方法模式。
避免过度使用工厂方法模式:工厂方法模式会增加系统的复杂性,因此应避免过度使用。
使用工厂方法模式与单例模式结合:在创建具体产品时,可以使用单例模式确保全局只有一个实例。
使用工厂方法模式与抽象工厂模式结合:当需要创建多个产品族时,可以将工厂方法模式与抽象工厂模式结合使用。
通过以上内容,相信读者已经对工厂方法模式有了深入的了解。在实际开发过程中,灵活运用工厂方法模式,可以提高代码的可扩展性和可维护性。
