Java工厂方法模式详解
一、概念介绍
1. 什么是工厂方法模式?
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它允许定义一个接口或抽象类来创建对象,但将实际对象的实例化延迟到子类中实现。工厂方法模式通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现对象的创建与使用分离,提高系统的灵活性和可扩展性。
2. 角色组成
工厂方法模式主要由以下四个角色组成:
1)抽象工厂(Creator):声明一个用于创建对象的工厂方法,该方法是一个抽象方法,由子类实现。
2)具体工厂(Concrete Creator):实现了抽象工厂接口,含有与应用相关的逻辑,用于创建具体的产品对象。
3)抽象产品(Product):定义了产品的接口,是工厂方法所创建对象的超类型,即工厂方法返回的对象类型。
4)具体产品(Concrete Product):实现了抽象产品接口的具体类,是被具体工厂创建的对象。
3. 特点
- 延迟实例化:将对象的实例化延迟到子类中实现。
- 符合开闭原则:新增产品时,只需新增相应的具体工厂类,无需修改原有代码。
- 降低耦合:客户端只依赖于抽象工厂接口和产品接口,降低了客户端与具体产品的耦合度。
二、使用场景与优缺点
1. 使用场景
工厂方法模式适用于以下场景:
- 需要创建的对象类型在编译时不确定:例如,根据不同的配置或输入参数创建不同类型的对象。
- 系统需要扩展,且不希望修改现有代码:新增产品时,只需新增具体工厂类,无需修改现有代码。
- 创建对象的过程复杂,且需要隐藏具体创建逻辑:将对象的创建过程封装在工厂类中,客户端无需关心创建细节。
2. 优点
- 良好的封装性:隐藏了对象创建的细节,客户端只需通过接口操作对象。
- 优秀的可扩展性:新增产品时,只需新增具体工厂类,符合开闭原则。
- 降低耦合度:客户端只依赖于抽象接口,降低了与具体实现的耦合。
3. 缺点
- 类的数量增加:针对每一种产品都需要定义一个具体工厂类,随着产品种类的增加,类的数量也相应增加。
- 产品族扩展困难:当需要新增产品族时,可能需要修改多个具体工厂类,影响系统的扩展性。
三、Java实现示例
以下是一个使用Java实现的工厂方法模式示例,模拟了一个简单的汽车制造场景。
1. 抽象产品接口(Car)
下面是一个抽象产品接口,它定义了产品对象的公共接口。在这个例子中,Car接口有一个run方法,用于描述汽车运行的行为。
public interface Car {
void run();
}
2. 具体产品实现类
Benz和BMW是实现了Car接口的具体产品类。它们分别提供了run方法的具体实现,用于描述不同品牌汽车的运行行为。
public class Benz implements Car {
@Override
public void run() {
System.out.println("Benz is running.");
}
}
public class BMW implements Car {
@Override
public void run() {
System.out.println("BMW is running.");
}
}
3. 抽象工厂接口(CarFactory)
下面是一个抽象工厂接口,它声明了工厂方法createCar,该方法返回一个Car类型的对象。抽象工厂接口是工厂方法模式的核心,它允许系统在不直接指定具体产品类的情况下创建对象。
public interface CarFactory {
Car createCar();
}
4. 具体工厂类
BenzFactory 和 BMWFactory 是实现了 CarFactory 接口的具体工厂类。它们分别重写了 createCar 方法,用于创建并返回具体的产品对象(Benz或BMW)。
public class BenzFactory implements CarFactory {
@Override
public Car createCar() {
return new Benz();
}
}
public class BMWFactory implements CarFactory {
@Override
public Car createCar() {
return new BMW();
}
}
5. 客户端
客户端通过工厂类来创建产品对象,而不是直接通过new关键字。这种方式使得客户端代码与具体产品类的实现解耦,提高了系统的灵活性和可扩展性。当需要添加新的产品类时,只需添加相应的具体产品类和具体工厂类,而无需修改客户端代码。
public class Client {
public static void main(String[] args) {
CarFactory benzFactory = new BenzFactory();
Car benz = benzFactory.createCar();
benz.run();
CarFactory bmwFactory = new BMWFactory();
Car bmw = bmwFactory.createCar();
bmw.run();
}
}
运行结果:
Benz is running.
BMW is running.
结束语
工厂方法设计模式通过引入工厂等级结构,允许系统在不直接指定具体产品类的情况下创建对象。它通过将对象的创建过程封装在工厂类中,使得客户端代码与具体产品类的实现解耦,提高了系统的灵活性和可扩展性。同时,它也遵循了开闭原则,即软件实体应该对扩展开放,对修改关闭。但也存在类数量增加和产品族扩展困难等缺点。
在实际应用中,应根据具体需求选择合适的设计模式,以提高代码的可维护性和可扩展性。通过工厂方法模式,Java开发者可以更灵活地管理对象的创建过程,从而编写出更加健壮和易于维护的代码。
简单动作,深刻联结。在这技术海洋,我备好舟,等你扬帆。启航吧!
🌟点击【关注】,解锁定期的技术惊喜,让灵感与知识的源泉不断涌动。
👍一个【点赞】,如同心照不宣的默契,是我们共同语言的闪亮印记。
📚【收藏】好文,搭建你的专属智慧库,让每次回望都能照亮新知之路。
源码地址:https://gitee.com/code-in-java/csdn-blog.git