全网最简单的Java设计模式【三】工厂方法模式详解

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. 具体产品实现类

BenzBMW是实现了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. 具体工厂类

BenzFactoryBMWFactory 是实现了 CarFactory 接口的具体工厂类。它们分别重写了 createCar 方法,用于创建并返回具体的产品对象(BenzBMW)。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值