【23种设计模式】工厂模式:理论剖析与Java实践

文章目录

  • 工厂模式:理论、Java 实现与实践应用
    • 一、工厂模式概述
    • 二、简单工厂模式
      • (一)理论介绍
      • (二)代码实现
      • (三)关键步骤
      • (四)流程图
    • 三、工厂方法模式
      • (一)理论介绍
      • (二)代码实现
      • (三)关键步骤
      • (四)流程图
    • 四、抽象工厂模式
      • (一)理论介绍
      • (二)代码实现
      • (三)关键步骤
      • (四)流程图
    • 五、工厂模式的应用场景
    • 六、工厂模式的优缺点
      • (一)优点
      • (二)缺点
    • 七、总结

工厂模式:理论、Java 实现与实践应用

一、工厂模式概述

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离。通过使用工厂模式,可以将对象的创建逻辑封装在一个专门的工厂类中,而不是在客户端代码中直接使用 new 关键字来创建对象。这样做的好处是,当需要创建新的对象或者修改对象的创建逻辑时,只需要在工厂类中进行修改,而不会影响到使用这些对象的客户端代码,提高了代码的可维护性和可扩展性。

二、简单工厂模式

(一)理论介绍

简单工厂模式定义了一个工厂类,这个工厂类有一个创建对象的方法,根据传入的参数不同来创建不同类型的对象。它不属于 23 种设计模式中的一种独立模式,通常被看作是工厂模式的基础。

(二)代码实现

  1. 首先创建一个产品接口:
public interface Product {void use();
}
  1. 然后创建具体的产品类实现该接口:
public class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用 ConcreteProductA");}
}public class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用 ConcreteProductB");}
}
  1. 接着创建简单工厂类:
public class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}return null;}
}

(三)关键步骤

  • 客户端代码通过调用简单工厂类的 createProduct 方法,并传入产品类型参数。
  • 简单工厂类根据传入的参数判断需要创建哪种具体的产品对象,并返回给客户端。

(四)流程图

开始
|
|-- 客户端调用 SimpleFactory.createProduct 并传入类型参数
|   |
|   |-- SimpleFactory 判断参数
|   |   |
|   |   |-- 如果是 "A",创建 ConcreteProductA 并返回
|   |   |
|   |   |-- 如果是 "B",创建 ConcreteProductB 并返回
|   |   |
|   |   |-- 其他情况,返回 null
结束

三、工厂方法模式

(一)理论介绍

工厂方法模式定义了一个创建对象的抽象方法,由子类决定实例化的类。工厂父类负责定义创建产品的公共接口,而具体的工厂子类负责创建具体的产品对象。这样在增加新的产品时,只需要增加相应的工厂子类和产品子类,符合开闭原则。

(二)代码实现

  1. 产品接口和具体产品类与简单工厂模式相同。
  2. 创建抽象工厂类:
public abstract class Factory {public abstract Product createProduct();
}
  1. 创建具体工厂类:
public class ConcreteFactoryA extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}public class ConcreteFactoryB extends Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}

(三)关键步骤

  • 客户端代码首先确定需要使用的具体工厂类。
  • 然后调用具体工厂类的 createProduct 方法,该方法创建并返回相应的具体产品对象。

(四)流程图

开始
|
|-- 客户端确定使用的具体工厂类(如 ConcreteFactoryA 或 ConcreteFactoryB)
|   |
|   |-- 调用具体工厂类的 createProduct 方法
|   |   |
|   |   |-- 具体工厂类创建并返回相应的产品对象(如 ConcreteProductA 或 ConcreteProductB)
结束

四、抽象工厂模式

(一)理论介绍

抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它可以创建多个不同类型的产品对象,这些产品对象通常属于同一个产品族。

(二)代码实现

  1. 定义多个产品接口:
public interface ProductA {void useA();
}public interface ProductB {void useB();
}
  1. 创建具体的产品类实现相应接口:
public class ConcreteProductA1 implements ProductA {@Overridepublic void useA() {System.out.println("使用 ConcreteProductA1");}
}public class ConcreteProductA2 implements ProductA {@Overridepublic void useA() {System.out.println("使用 ConcreteProductA2");}
}public class ConcreteProductB1 implements ProductB {@Overridepublic void useB() {System.out.println("使用 ConcreteProductB1");}
}public class ConcreteProductB2 implements ProductB {@Overridepublic void useB() {System.out.println("使用 ConcreteProductB2");}
}
  1. 创建抽象工厂类:
public abstract class AbstractFactory {public abstract ProductA createProductA();public abstract ProductB createProductB();
}
  1. 创建具体的抽象工厂子类:
public class ConcreteFactory1 extends AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}public class ConcreteFactory2 extends AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}

(三)关键步骤

  • 客户端代码首先确定需要使用的具体抽象工厂子类。
  • 然后通过该工厂子类创建一系列相关的产品对象。

(四)流程图

开始
|
|-- 客户端确定使用的具体抽象工厂子类(如 ConcreteFactory1 或 ConcreteFactory2)
|   |
|   |-- 调用具体抽象工厂子类的 createProductA 和 createProductB 方法
|   |   |
|   |   |-- 具体抽象工厂子类创建并返回相应的产品对象(如 ConcreteProductA1、ConcreteProductB1 或 ConcreteProductA2、ConcreteProductB2)
结束

五、工厂模式的应用场景

  • 对象创建复杂时:当对象的创建过程涉及到复杂的逻辑,如读取配置文件、连接数据库等操作时,使用工厂模式可以将这些复杂的创建过程封装在工厂类中,使客户端代码更加简洁。例如创建数据库连接对象,不同的数据库(如 MySQL、Oracle)可能有不同的连接创建方式,通过工厂模式可以方便地创建对应的连接对象。
  • 根据不同条件创建不同对象时:在软件系统中,根据不同的运行时条件(如用户输入、系统配置等)需要创建不同类型的对象,工厂模式可以很好地处理这种情况。比如在图形绘制系统中,根据用户选择绘制圆形或矩形,工厂模式可以根据用户的选择创建相应的圆形绘制对象或矩形绘制对象。

六、工厂模式的优缺点

(一)优点

  • 解耦对象的创建和使用:使得代码的依赖关系更加清晰,使用者不需要了解对象的具体创建过程,只需要关心如何使用对象。
  • 易于扩展:无论是简单工厂模式添加新的产品类型,还是工厂方法模式和抽象工厂模式增加新的产品族或产品,都相对容易实现,符合开闭原则。

(二)缺点

  • 增加代码复杂度:引入工厂模式会增加代码的层次结构和类的数量,对于简单的应用场景可能会显得过于复杂。
  • 抽象工厂模式的局限性:抽象工厂模式虽然可以创建一系列相关的产品,但当产品族中需要增加新的产品类型时,可能需要修改抽象工厂类及其所有子类,违反了开闭原则。

七、总结

工厂模式在 Java 编程中是非常重要的创建型设计模式,包括简单工厂模式、工厂方法模式和抽象工厂模式。它们各自适用于不同的场景,通过合理地运用工厂模式,可以提高代码的可维护性、可扩展性和灵活性,有效地管理对象的创建过程,为构建复杂的软件系统提供有力的支持。在实际项目开发中,需要根据具体的需求和系统架构来选择合适的工厂模式类型,以达到最佳的设计效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动手学电机驱动】STM32-FOC(10)使用旋钮调节电机转速

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

使用Pygame创建一个简单的消消乐游戏

消消乐游戏是一种经典的益智游戏,玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块,从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。 准备工作 在开始之前,请确保已安装Pygame库。可以通过以下命…

12.Java 泛型(自定义泛型类、自定义泛型接口、自定义泛型方法、泛型的继承与通配符)

一、泛型引入 1、为什么需要泛型 传统方式存在的问题 不能对加入到集合中的数据类型进行约束 遍历时,需要进行类型转换 泛型的理解与好处 编译时能检查添加元素的类型 能减少类型转换的次数 2、泛型初体验 (1)说明 这里以 Dog 类为例…

最新,Vue 性能提升 400%

最近,Vue 团队核心成员 Johnson Chu 开源一个全新的信号库:alien-signals,这是一个基于 Vue 3.4 响应式系统重写的研究型信号库,可以使 Vue 3.4 的响应式系统性能提升 400%。目前,alien-signals 是所有信号库中最快的实…

springboot mvn 打包,jar和资源文件分离打包

默认打包方式如下&#xff1a; <build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><execution…

OpenHarmony-3.HDF框架(2)

OpenHarmony HDF 平台驱动 1.平台驱动概述 系统平台驱动框架是系统驱动框架的重要组成部分&#xff0c;它基于HDF驱动框架、操作系统适配层(OSAL, operating system abstraction layer)以及驱动配置管理机制&#xff0c;为各类平台设备驱动的实现提供标准模型。 系统平台驱动(…

BT1120接口自学笔记

一、技术简介 1.1名词解释 BT.1120协议是一种广泛应用的高清数字视频传输协议,能够把取样结构为4:4:4和4:4:2的视频数据编码成内嵌同步定时基准码的视频数据流进行传输。也可以用于ITU-R BT.709建议书和ITU-R BT.2100建议书规定的像素阵列为1 920*1080视屏数据传输。 经常听…

http multipart/form-data 数据如何分块传输是一次传输还是多次

multipart/form-data 是一种用于 HTTP 协议中传输数据的格式&#xff0c;它用于传输数据量较大的数据&#xff0c;如文件等。在 multipart/form-data 中&#xff0c;数据可以被分成多个部分&#xff08;chunk&#xff09;&#xff0c;这些部分之间通过特定的分隔符进行分隔。 …

pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具

一、简介 MinerU是开源、高质量的数据提取工具&#xff0c;支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面&#xff0c;适用于学术、商业、金融、法律等多领域&#xff0c;提高数据获取效率。一站式、开源、高质量的数据提取工具&…

浔川AI翻译v5.1.0版本正式亮相!

浔川 AI 翻译 v5.1.0 版本正式亮相&#xff01; 在科技浪潮汹涌澎湃的今天&#xff0c;浔川 AI 翻译以其卓越的技术实力和对用户需求的精准把握&#xff0c;自豪地向全球用户宣布&#xff1a;浔川 AI 翻译 v5.1.0 版本正式闪耀登场&#xff01;这一全新版本在继承以往优势的基础…

【QNX+Android虚拟化方案】130 - io-pkt-v6-hc 相关问题log抓取命令整理

【QNX+Android虚拟化方案】130 - io-pkt-v6-hc 相关问题log抓取命令整理 基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代码文档!!! 本文禁止转载分享 !!! 汇总链接:《【QNX+Android虚拟化方案】00 - 系列文章链接汇总》 本文链接:《【QNX…

安装更新upgrade导致ubuntu崩溃

安装更新导致ubuntu崩溃 前言uuid编不过&#xff0c;导致的崩溃 记录一些ubuntu崩溃的过程。 目前只有一个&#xff0c;以后遇到都放在这里&#xff0c;以提醒自己。 前言 如果从10000年看现在的linux&#xff0c;不是说不完美&#xff0c;而是糟透了。 linux的版本号&#xf…

探索前端世界的无限可能:玩转Excel文件

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

MySQL两阶段提交目的

阶段提交的过程 事务执行阶段&#xff1a;事务开始执行&#xff0c;InnoDB执行SQL语句的具体操作&#xff0c;如数据修改、删除等&#xff0c;并将这些操作记录在内存中。写入Redo Log&#xff08;准备阶段&#xff09;&#xff1a;事务即将提交时&#xff0c;首先将事务相关的…

前端项目使用gitlab-cicd+docker实现自动化部署

GitLab CI/CD 是一个强大的工具&#xff0c;可以实现项目的自动化部署流程&#xff0c;从代码提交到部署只需几个步骤。本文将带你配置 GitLab CI/CD 完成一个前端项目的自动化部署。 前言 为什么使用cicddocker&#xff1f; 目前我们公司开发环境使用的shell脚本部署&#…

丢垃圾视频时间检测 -- 基于状态机的实现

文章目录 OverviewKey PointsPseudo-code Overview 需要考虑的方面 状态定义和转换条件时序约束空间约束异常处理 状态机的设计需要考虑的场景&#xff1a; 没有人人进入人携带垃圾人离开但垃圾留下垃圾消失异常情况&#xff08;检测失败、多人多垃圾等&#xff09; Key P…

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…

DApp开发前端框架选择:React还是Vue?

在区块链DApp开发中&#xff0c;前端框架的选择对用户体验和开发效率至关重要。React和Vue作为两大主流前端框架&#xff0c;各自拥有广泛的开发者基础和丰富的生态支持。那么在DApp开发中&#xff0c;该如何选择适合自己的框架呢&#xff1f;下面我们来比较一下&#xff0c;看…

6. 一分钟读懂“抽象工厂模式”

6.1 模式介绍 书接上文&#xff0c;工厂方法模式只能搞定单一产品族&#xff0c;遇到需要生产多个产品族时就歇菜了。于是&#xff0c;在需求的“花式鞭策”下&#xff0c;程序员们再次绷紧脑细胞&#xff0c;创造出了更强大的抽象工厂模式&#xff0c;让工厂一次性打包多个产品…

gulp应该怎么用,前端批量自动化替换文件

背景 最近公司准备把所有项目中用到的国际化相关的key规范化&#xff0c;原因是: 一直以来公司的app和web端 在针对相同的需求以及相同的国际化语言&#xff0c;需要设置不同的两份国际化文件&#xff0c;难以维护旧版的国际化文件中&#xff0c;存在的大量值重复&#xff0c…