工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern)是Java设计模式中的一种创建型模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。这种模式属于创建型模式,它在一个超类中定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。
模式结构
工厂方法模式的结构组成主要包括以下几个元素:
- 抽象产品(Abstract Product):定义工厂方法模式所创建的对象的接口。它可以是抽象类或接口,声明了产品的共同特征。
- 具体产品(Concrete Product):实现Product接口,是工厂方法模式具体创建的对象。每个具体产品都实现了产品接口,并提供了具体的实现。
- 抽象工厂(Abstract Factory):声明了创建产品对象的抽象方法(工厂方法),可以是接口或抽象类。客户端通过调用这个工厂方法来创建产品。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建产品的具体工厂类。每个具体工厂类对应创建一种具体产品。
- 客户端(Client):调用抽象工厂的方法来创建产品,而不直接实例化具体产品。客户端依赖于抽象工厂和抽象产品,从而实现了松耦合。
要点
工厂方法模式是一种创建型设计模式,其要点包括以下几个方面:
- 将对象的实例化延迟到子类:工厂方法模式的核心思想是将对象的创建延迟到子类中。具体的对象实例化由具体的工厂类(子类)负责。
- 客户端通过工厂方法创建对象:客户端代码通过调用抽象工厂的工厂方法来创建产品对象,而不直接实例化具体产品。
- 依赖倒置原则(Dependency Inversion Principle): 工厂方法模式符合依赖倒置原则,高层模块不依赖于底层模块的实现细节,而是依赖于抽象。
- 实现松耦合:工厂方法模式实现了客户端与具体产品类的解耦,客户端只需要知道抽象产品和抽象工厂,而不需要关心具体产品的实现细节。
- 扩展性良好:工厂方法模式支持系统的扩展,可以方便地添加新的产品类和对应的工厂类,而不需要修改现有的代码。
案例说明
假设我们要设计一个简单的电脑生产系统,其中有两种类型的电脑:台式电脑和笔记本电脑。我们使用工厂方法模式来创建这两种类型的电脑。
1. 定义抽象产品
代码语言:java复制// 抽象产品:电脑
interface Computer {
void displayInfo();
}
2. 具体产品
代码语言:java复制// 具体产品A:台式电脑
class DesktopComputer implements Computer {
@Override
public void displayInfo() {
System.out.println("Desktop Computer");
}
}
// 具体产品B:笔记本电脑
class LaptopComputer implements Computer {
@Override
public void displayInfo() {
System.out.println("Laptop Computer");
}
}
3. 抽象工厂
代码语言:java复制// 抽象工厂:电脑工厂
interface ComputerFactory {
Computer createComputer();
}
4. 具体工厂
代码语言:java复制// 具体工厂A:台式电脑工厂
class DesktopComputerFactory implements ComputerFactory {
@Override
public Computer createComputer() {
return new DesktopComputer();
}
}
// 具体工厂B:笔记本电脑工厂
class LaptopComputerFactory implements ComputerFactory {
@Override
public Computer createComputer() {
return new LaptopComputer();
}
}
5. 客户端代码
代码语言:java复制public class Client {
public static void main(String[] args) {
// 使用具体工厂A创建台式电脑
ComputerFactory desktopFactory = new DesktopComputerFactory();
Computer desktopComputer = desktopFactory.createComputer();
desktopComputer.displayInfo();
// 使用具体工厂B创建笔记本电脑
ComputerFactory laptopFactory = new LaptopComputerFactory();
Computer laptopComputer = laptopFactory.createComputer();
laptopComputer.displayInfo();
}
}
在这个例子中,Computer 是抽象产品,DesktopComputer 和 LaptopComputer 是具体产品。ComputerFactory 是抽象工厂,DesktopComputerFactory 和 LaptopComputerFactory 是具体工厂。
(客户端)通过具体工厂来创建不同类型的电脑,而不需要知道每种电脑的具体实现。这种方式使得系统更容易扩展,如果将来需要添加新类型的电脑,只需创建新的具体产品和具体工厂即可,而无需修改客户端代码。这符合工厂方法模式的核心思想。
使用场景:
- 当需要创建一组相关或相互依赖的产品对象时,可以使用工厂方法模式。例如,创建不同类型的数据库连接对象、创建不同类型的日志记录器等。
- 当客户端无需关心对象的具体创建过程,只关心如何使用对象时,可以使用工厂方法模式。这样可以提供更高的抽象级别,减少了客户端与具体类之间的依赖。
- 当需要扩展新的产品类型而无需修改现有代码时,可以使用工厂方法模式。通过添加新的具体工厂和产品类,可以方便地增加新的产品种类,而不影响现有的代码。
扩展
工厂方法模式和抽象工厂模式区别在于:
- 工厂方法模式的目的是创建单个对象,而抽象工厂模式的目的是创建相关或依赖对象的家族。
- 工厂方法模式使用单个方法来创建对象,而抽象工厂模式使用一组相关方法来创建对象家族。
- 工厂方法模式适用于需要创建的对象类型较少且稳定,而抽象工厂模式适用于需要创建的对象类型较多且相互关联。
- 扩展性不同:工厂方法模式容易扩展,只需要添加一个新的工厂类来创建新类型的对象,而抽象工厂模式需要修改抽象工厂接口和所有实现类来添加新类型的对象。
总之,工厂方法模式用于创建单个对象,而抽象工厂模式用于创建相关的对象家族。选择哪种模式取决于具体的应用场景和设计要求。
我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!