创建型模式-工厂模式
工厂模式是一种常见的创建型设计模式,它提供了一种统一的接口来创建对象,而无需直接暴露对象的实例化逻辑给客户端代码。工厂模式将对象的实例化过程封装在一个工厂类中,客户端只需通过调用工厂类的方法来获取所需的对象。
工厂模式通常涉及角色
-
抽象产品(
Abstract Product
):抽象产品是一个接口或抽象类,定义了产品的通用行为和特征。具体的产品类将实现这个抽象产品,并提供具体的实现细节。
-
具体产品(
Concrete Product
):具体产品是抽象产品的具体实现类。它们实现了抽象产品中定义的方法,并提供了具体的功能。
-
抽象工厂(
Abstract Factory
):抽象工厂是一个接口或抽象类,定义了创建产品对象的方法。它可以有多个不同的具体工厂实现类,每个具体工厂实现类负责创建一组具体的产品。
-
具体工厂(
Concrete Factory
):具体工厂是抽象工厂的具体实现类。它负责实现抽象工厂中定义的方法,根据客户端的请求来创建具体的产品对象。
工厂模式的工作流程
- 客户端通过调用抽象工厂的方法来请求创建产品对象。
- 抽象工厂根据客户端的请求,选择相应的具体工厂来创建具体的产品对象。
- 具体工厂根据抽象产品的定义,实例化具体产品对象,并返回给客户端。
- 客户端通过抽象产品的接口使用具体产品对象,而不需要知道具体产品的实现细节。
工厂模式的优点
- 封装了对象的实例化过程,减少了客户端与具体产品之间的依赖关系。
- 提供了灵活性和可扩展性,允许在不修改客户端代码的情况下引入新的产品类和工厂类。
- 降低了代码重复,可以集中管理对象的创建逻辑。
工厂模式示例
创建不同类型的汽车为例
// 抽象产品
interface Car {
void drive();
}
// 具体产品
class SedanCar implements Car {
public void drive() {
System.out.println("Driving a Sedan car.");
}
}
class SUVCar implements Car {
public void drive() {
System.out.println("Driving an SUV car.");
}
}
// 抽象工厂
interface CarFactory {
Car createCar();
}
// 具体工厂
class SedanCarFactory implements CarFactory {
public Car createCar() {
return new SedanCar();
}
}
class SUVCarFactory implements CarFactory {
public Car createCar() {
return new SUVCar();
}
}
// 客户端
public class Main {
public static void main(String[] args) {
CarFactory sedanFactory = new SedanCarFactory();
Car sedan = sedanFactory.createCar();
sedan.drive(); // Output: Driving a Sedan car.
CarFactory suvFactory = new SUVCarFactory();
Car suv = suvFactory.createCar();
suv.drive(); // Output: Driving an SUV car.
}
}
在这个示例中,使用了Java
的接口(interface
)来定义抽象产品Car
和抽象工厂CarFactory
。具体产品类SedanCar
和SUVCar
分别实现了Car
接口的drive()
方法。
具体工厂类SedanCarFactory
和SUVCarFactory
实现了CarFactory
接口,并分别实现了createCar()
方法来创建相应类型的汽车对象。
在客户端Main
类中,我们首先实例化具体的工厂类(例如SedanCarFactory
)来创建对应类型的汽车对象(例如SedanCar
)。然后,我们可以通过汽车对象的接口来使用具体的功能(例如drive()
方法)。
通过使用工厂模式,客户端可以通过调用工厂的方法来创建不同类型的汽车对象,而不需要直接与具体的产品类交互,从而实现了解耦和灵活性。
们可以通过汽车对象的接口来使用具体的功能(例如drive()
方法)。
通过使用工厂模式,客户端可以通过调用工厂的方法来创建不同类型的汽车对象,而不需要直接与具体的产品类交互,从而实现了解耦和灵活性。
总的来说,工厂模式通过将对象的创建过程封装在工厂类中,提供了一种灵活、可扩展的方式来创建对象。它能够降低客户端代码与具体产品的耦合度,提供了一种统一的接口来创建对象。