【Java】设计模式——工厂模式

news/2024/11/15 2:12:41/

前言

在软件开发中,设计模式是一种解决常见问题的标准方法。工厂模式(Factory Pattern)是其中最常用的一种创建型设计模式,它提供了一个接口用于创建对象,但不暴露对象的创建逻辑。通过工厂模式,我们可以将对象的创建与使用分离,使得系统具有更好的灵活性和可扩展性。

1. 什么是工厂模式

工厂模式属于创建型模式,其核心思想是通过工厂类(或方法)来创建对象,而不是直接在客户端代码中使用 new 关键字来实例化对象。通过这种方式,工厂模式将对象的创建过程封装起来,减少了系统中直接依赖具体类的情况,从而使得系统在扩展时更加灵活。


2. 工厂模式的分类

工厂模式可以分为三种常见的形式:

  • 简单工厂模式(Simple Factory):通过一个工厂类来实例化不同类型的对象。
  • 工厂方法模式(Factory Method):通过子类来决定具体创建哪个类的实例。
  • 抽象工厂模式(Abstract Factory):提供一个接口,用来创建相关或依赖对象的家族。

我们下面将重点介绍简单工厂模式和工厂方法模式。


2.1 简单工厂模式

假设我们有一个场景,需要根据用户的选择创建不同类型的汽车。我们可以使用简单工厂模式来实现这一功能。

首先,定义一个产品接口或抽象类,表示所有产品的公共方法。

java">public interface Car {void drive();
}

然后,实现具体的汽车类。

public class SedanCar implements Car {@Overridepublic void drive() {System.out.println("驾驶轿车");}
}public class SUVCar implements Car {@Overridepublic void drive() {System.out.println("驾驶SUV");}
}

接下来,创建一个工厂类,根据参数决定创建哪种类型的汽车。

java">public class CarFactory {public static Car createCar(String type) {if ("sedan".equals(type)) {return new SedanCar();} else if ("suv".equals(type)) {return new SUVCar();} else {throw new IllegalArgumentException("未知的汽车类型");}}
}

最后,在客户端代码中使用工厂类来创建汽车对象。

java">public class Client {public static void main(String[] args) {Car sedan = CarFactory.createCar("sedan");sedan.drive();Car suv = CarFactory.createCar("suv");suv.drive();}
}

简单工厂模式通过一个 CarFactory 类来决定创建具体的 Car 实现类。在客户端代码中,我们只需要通过工厂类获取所需对象,而无需关心具体对象的创建过程。这种方式使得系统更具灵活性,客户端代码的耦合度也较低,适用于产品种类较少且不需要扩展的情况。


2.2 工厂方法模式

假设我们希望每个子类都能创建自己的产品,可以使用工厂方法模式。
同样,定义一个产品接口或抽象类。

java">public interface Car {void drive();
}

实现具体的汽车类。

java">public class SedanCar implements Car {@Overridepublic void drive() {System.out.println("驾驶轿车");}
}public class SUVCar implements Car {@Overridepublic void drive() {System.out.println("驾驶SUV");}
}

定义一个工厂接口,声明创建产品的抽象方法。

java">public interface CarFactory {Car createCar();
}

实现具体的工厂类,每个工厂类负责创建一种特定的产品。

java">public class SedanCarFactory implements CarFactory {@Overridepublic Car createCar() {return new SedanCar();}
}public class SUVCarFactory implements CarFactory {@Overridepublic Car createCar() {return new SUVCar();}
}

在客户端代码中使用工厂方法来创建汽车对象。

java">public class Client {public static void main(String[] args) {CarFactory sedanFactory = new SedanCarFactory();Car sedan = sedanFactory.createCar();sedan.drive();CarFactory suvFactory = new SUVCarFactory();Car suv = suvFactory.createCar();suv.drive();}
}

工厂方法模式将对象的创建委托给具体的工厂类,而不是由客户端直接决定对象的创建方式。每个工厂类都负责创建一种特定类型的对象,这使得系统在扩展时可以灵活地添加新的产品类型,而无需修改现有的代码,适用于产品种类较多且需要扩展的情况。


3. 工厂模式的优缺点

优点:

  • 解耦:工厂模式通过抽象工厂类和具体实现类,将对象的创建与使用分离,从而减少了客户端对具体类的依赖。
  • 扩展性强:如果需要增加新的产品类型,只需添加一个新的具体产品类及相应的工厂类,而不需要修改现有的代码。
  • 单一职责:工厂类负责创建对象,符合单一职责原则,使得系统的设计更加清晰。

缺点:

  • 增加类的数量:工厂模式需要额外的工厂类和产品类,会导致系统中类的数量增加。
  • 复杂性增加:对于简单的对象创建,使用工厂模式可能会显得过于复杂。

4. 总结

工厂模式是一种常用的创建型设计模式,它通过将对象的创建过程封装到工厂类中,减少了客户端与具体类的耦合。通过使用工厂模式,我们可以更好地组织和管理对象的创建,提升代码的灵活性和可维护性。在实际开发中,工厂模式特别适合处理需要创建多个相似对象的场景,尤其是在产品种类较多、类的扩展较为频繁时,工厂模式显得尤为重要。


http://www.ppmy.cn/news/1547098.html

相关文章

docker之容器设置开机自启(4)

命令语法: docker update --restartalways 容器ID/容器名 选项: --restart参数 no 默认策略,在容器退出时不重启容器 on-failure 在容器非正常退出时(退出状态非0),才会重启容器 …

自动驾驶3D目标检测综述(二)

文章地址:[2206.09474] 3D Object Detection for Autonomous Driving: A Comprehensive Survey (arxiv.org) 这篇文章紧接上一篇文章:自动驾驶3D目标检测综述(一)-CSDN博客从第三章开始介绍。 目录 一、3D目标检测的数据表示 1…

PostgreSQL-日期转换

获取日期 select current_date;----2021-03-19select current_time;----14:14:16.97125408select current_timestamp;----2021-03-19 14:14:16.97125408select localtimestamp;----2021-03-19 14:14:16.971254select now();----2021-03-19 14:14:16.97125408把时间戳转换成字符…

AcWing 303 运输小猫

代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int N 100010, M 100010, P 110;int n, m, p; LL d[N], t[N], a[N], s[N]; LL f[P][M]; int q[M];LL get_y(int k, int j) {return f…

基于Testng + Playwright的H5自动化巡检工具

文章目录 H5巡检工具必要性代码整体架构Demo 试用&#xff0c;一看便知技术细节1 、页面主要元素检测2、视觉回归3、性能分析4、网络请求资源分析5、定时巡检 开源 H5巡检工具必要性 你是否也遇到过&#xff0c;H5突然白屏&#xff0c;无法加载的情况&#xff1f; 遇到上述问题…

VTK知识学习(6)-使用颜色

1、概述 颜色是Actor重要的属性之一。VTK采用RGB和HSV两种颜色系统来描述颜色。 RGB颜色系统是由三个颜色分量&#xff1a; R&#xff08;红色&#xff09;、G&#xff08;绿色&#xff09;、B&#xff08;蓝色&#xff09;的组合表示。取值范围0~1。(0&#xff0c;0&#xf…

ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!

通义千问代码模型开源版。Qwen2.5-Coder相比CodeQwen1.5有了实质性的改进。Qwen2.5-Coder在包含5.5万亿Token的编程相关数据上进行了训练&#xff0c;使即使较小的编程专用模型也能在编程评估基准测试中表现出媲美大型语言模型的竞争力。 阿里云-2024年11月12日 Qwen2.5-Coder …

【NLP】2024 年十大 RAG 框架 Github

检索增强生成 (RAG) 已成为增强大型语言模型功能的强大技术。 RAG 框架将基于检索的系统与生成模型的优势相结合&#xff0c;从而实现更准确、更情境化和更及时的响应。随着对复杂 AI 解决方案的需求不断增长&#xff0c;GitHub 上出现了许多开源 RAG 框架&#xff0c;每个框架…