当前位置: 首页 > news >正文

Java设计模式【工厂模式】

Java设计模式【工厂模式】

前言

三种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式;

  • 创建型设计模式
  • 封装对象的创建过程,将对象的创建和使用分离开,从而提高代码的可维护性和可扩展性

简单工厂模式

概述:将对象的创建过程封装在一个工厂类中,客户端通过工厂类来创建对象。
特点:

  • 一个工厂类+多个产品类
  • 添加新的产品类时,就必须修改工厂类的代码,这违反了开闭原则
package com.qiangesoft.design.creational.factory.simple;/*** 简单工厂模式*/
public class SimpleFactory {public static void main(String[] args) {// 奔驰车Car benz = CarFactory.buildCar("benz");benz.running();// 宝马车Car bmw = CarFactory.buildCar("bmw");bmw.running();// 奥迪车Car audi = CarFactory.buildCar("audi");audi.running();}
}/*** 1.工厂类*/
class CarFactory {public static Car buildCar(String type) {if ("benz".equals(type)) {return new Benz();} else if ("bmw".equals(type)) {return new BMW();} else if ("audi".equals(type)) {return new Audi();} else {throw new IllegalArgumentException("Illegal argument for type: " + type);}}
}/*** 2.抽象产品接口*/
interface Car {void running();
}/*** 3.产品实现类* 奔驰、宝马、奥迪*/
class Benz implements Car {@Overridepublic void running() {System.out.println("奔驰车在路上跑!");}
}class BMW implements Car {@Overridepublic void running() {System.out.println("宝马车在路上跑!");}
}class Audi implements Car {@Overridepublic void running() {System.out.println("奥迪车在路上跑!");}
}

工厂方法模式

概述:定义一个工厂接口和多个具体工厂类来实现对象的创建。每个具体工厂类都实现了工厂接口,并负责创建一类产品对象。
特点:

  • 一个工厂接口+多个具体工厂类
  • 具体的产品类和工厂类都可以在运行时动态切换,符合开闭原则
package com.qiangesoft.design.creational.factory.method;/*** 工厂方法模式*/
public class FactoryMethod {public static void main(String[] args) {// 奔驰车CarFactory benzFactory = new BenzFactory();Car benzCar = benzFactory.buildCar();benzCar.running();// 宝马车CarFactory bmwFactory = new BMWFactory();Car bmwCar = bmwFactory.buildCar();bmwCar.running();// 奥迪车CarFactory audiFactory = new AudiFactory();Car audiCar = audiFactory.buildCar();audiCar.running();}
}/*** 1.抽象工厂接口*/
interface CarFactory {Car buildCar();
}/*** 2.工厂实现类* 奔驰工厂、宝马工厂、奥迪工厂*/
class BenzFactory implements CarFactory {@Overridepublic Car buildCar() {return new Benz();}
}class BMWFactory implements CarFactory {@Overridepublic Car buildCar() {return new BMW();}
}class AudiFactory implements CarFactory {@Overridepublic Car buildCar() {return new BMW();}
}/*** 3.抽象产品接口*/
interface Car {void running();
}/*** 4.产品实现类* 奔驰、宝马、奥迪*/
class Benz implements Car {@Overridepublic void running() {System.out.println("奔驰车在路上跑!");}
}class BMW implements Car {@Overridepublic void running() {System.out.println("宝马车在路上跑!");}
}class Audi implements Car {@Overridepublic void running() {System.out.println("奥迪车在路上跑!");}
}

抽象工厂模式

概述:工厂方法模式的升级版,它定义了多个工厂接口和多个产品族接口,每个工厂接口负责创建一类产品族对象,每个产品族接口负责定义一类产品对象。具体工厂类实现工厂接口并负责创建一类产品族对象,具体产品类实现产品族接口并负责创建一类产品对象。
特点:

  • 多个工厂接口+多个产品族接口
  • 具体的产品族和工厂类都可以在运行时动态切换,符合开闭原则
package com.qiangesoft.design.creational.factory.abstractf;/*** 抽象工厂模式*/
public class AbstractFactory {public static void main(String[] args) {// 奔驰车CarFactory benzFactory = new BenzFactory();Engine benzEngine = benzFactory.createEngine();Transmission benzTransmission = benzFactory.createTransmission();System.out.println("奔驰汽车:" + benzEngine.getName() + "+" + benzTransmission.getName());// 宝马车CarFactory bmwFactory = new BMWFactory();Engine bmwEngine = bmwFactory.createEngine();Transmission bmwTransmission = bmwFactory.createTransmission();System.out.println("宝马汽车:" + bmwEngine.getName() + "+" + bmwTransmission.getName());// 奥迪车CarFactory audiFactory = new AudiFactory();Engine audiEngine = audiFactory.createEngine();Transmission audiTransmission = audiFactory.createTransmission();System.out.println("奥迪汽车:" + audiEngine.getName() + "+" + audiTransmission.getName());}
}/*** 1.抽象工厂接口*/
interface CarFactory {Engine createEngine();Transmission createTransmission();
}/*** 2.具体工厂类* 奔驰工厂、宝马工厂、奥迪工厂*/
class BenzFactory implements CarFactory {@Overridepublic Engine createEngine() {return new BenzEngine();}@Overridepublic Transmission createTransmission() {return new BenzTransmission();}
}class BMWFactory implements CarFactory {@Overridepublic Engine createEngine() {return new BMWEngine();}@Overridepublic Transmission createTransmission() {return new BmwTransmission();}
}class AudiFactory implements CarFactory {@Overridepublic Engine createEngine() {return new AudiEngine();}@Overridepublic Transmission createTransmission() {return new AudiTransmission();}
}/*** 3.产品接口1:发动机*/
interface Engine {String getName();
}/*** 4.产品实现类1:发动机*/
class BenzEngine implements Engine {@Overridepublic String getName() {return "奔驰发动机";}
}class BMWEngine implements Engine {@Overridepublic String getName() {return "宝马发动机";}
}class AudiEngine implements Engine {@Overridepublic String getName() {return "奥迪发动机";}
}/*** 5.产品接口2:变速箱*/
interface Transmission {String getName();
}/*** 6.产品实现类2:变速箱*/
class BenzTransmission implements Transmission {@Overridepublic String getName() {return "奔驰变速箱";}
}class BmwTransmission implements Transmission {@Overridepublic String getName() {return "宝马变速箱";}
}class AudiTransmission implements Transmission {@Overridepublic String getName() {return "奥迪变速箱";}
}

总结

  • 简单工厂模式适用于创建单一类型的产品对象
  • 工厂方法模式适用于创建多种类型的产品对象
  • 抽象工厂模式适用于创建多个产品族的对象

相关文章:

Java设计模式【工厂模式】

Java设计模式【工厂模式】 前言 三种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式; 创建型设计模式封装对象的创建过程,将对象的创建和使用分离开,从而提高代码的可维护性和可扩展性 简单工厂模式 概述:将…...

AI智能分析+明厨亮灶智慧管理平台助力“舌尖上的安全”

春节是中国最重要的传统节日之一,在春节期间,人们聚餐需求激增,餐饮业也迎来了高峰期。在这个时期,餐饮企业需要更加注重食品安全和卫生质量,以保证消费者的健康和权益,明厨亮灶智慧管理成为了餐饮业中备受…...

【现代密码学基础】详解完美安全与香农定理

目录 一. 介绍 二. 完美安全的密钥与消息空间 三. 完美安全的密钥长度 四. 最优的完美安全方案 五. 香农定理 (1)理论分析 (2)严格的正向证明 (3)严格的反向证明 六. 小结 一. 介绍 一次一密方案…...

Python 将文本转换成语音播放 pyttsx3

Python 将文本转换成语音播放 pyttsx3 目录 Python 将文本转换成语音播放 pyttsx3 1. 安装 2. 使用 3. 封装 Pyttsx3 是一个 Python 库,它提供了文本到语音(Text-to-Speech,TTS)转换的功能。这个库允许 Python 程序通过调用本…...

FPGA高端项目:Xilinx Artix7系列FPGA 多路视频缩放拼接 工程解决方案 提供4套工程源码+技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我这里已有的FPGA图像缩放方案我已有的FPGA视频拼接叠加融合方案本方案的Xilinx Kintex7系列FPGA上的ov5640版本本方案的Xilinx Kintex7系列FPGA上的HDMI版本 3、设计思路框架设计框图…...

开源模型应用落地-业务优化篇(三)

一、前言 假如您跟随我的脚步,学习到上一篇的内容,到这里,相信细心的您,已经发现了,在上一篇中遗留的问题。那就是IM服务过载的时候,如何进行水平扩容? 因为在每个IM服务中,我们用JV…...

基于SpringBoot+Vue实现的物流快递仓库管理系统

基于SpringBootVue实现的物流快递仓库管理系统 文章目录 基于SpringBootVue实现的物流快递仓库管理系统系统介绍技术选型成果展示账号地址及其他说明源码获取 系统介绍 系统演示 关注视频号【全栈小白】,观看演示视频 基于SpringBootVue实现的物流快递仓库管理系…...

编程笔记 html5cssjs 072 JavaScrip BigInt数据类型

编程笔记 html5&css&js 072 JavaScrip BigInt数据类型 一、BigInt 数据类型二、BigInt 的创建和使用三、BigInt 操作与方法三、示例小结 JavaScript BigInt 数据类型是一种内置的数据类型,用于表示大于 Number.MAX_SAFE_INTEGER(即2^53 - 1&…...

matlab simulink 步进电机控制

1、内容简介 略 41-可以交流、咨询、答疑 2、内容说明 电动执行器定位控制在生产生活中具有广泛的应用,在使用搭载步进电机的电动执行器进行定位控制的时候,定位系统的定位精度和响应波形,会随着负载质量的变化而变化,这是由电…...

使用阿里云的IDaaS实现知行之桥EDI系统的单点登录

,在开始测试之前,需要确定用哪个信息作为“登陆用户的ID字段”。 这个字段用来在完成SSO登陆之后,用哪个信息将阿里云IDaaS的用户和知行之桥EDI系统的用户做对应。这里我们使用了 phonenumber 这个自定义属性。需要在阿里云做如下配置&#x…...

基于微服务的高考志愿智能辅助决策系统(附源码)

目录 一.引言 1、编写目的 2、系统功能概述 二.功能分析 三.微服务模块 1、微服务用户相关模块 (1)用户注册 (2)用户登录 (3)用户信息管理 (4)用户操作 2、微服务文件云存…...

LeetCode —— 137. 只出现一次的数字 II

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…...

pnpm、npm、yarn 包管理工具

1、npm 关键词:软件包管理器、命令行工具、一个社区和一个平台 npm(Node Package Manager)是一个用于Node.js环境的软件包管理器。它是一个命令行工具,用于安装、升级、删除和管理JavaScript软件包。npm最初是随同Node.js一起发布…...

微服务知识

1、概念 大型单体应用拆分成多个独立部署运行的微服务(解决并发问题)​​​​​​​ 2、特点 3、技术栈 4、微服务带来的问题 ​​​​​​​ 5、微服务的注册中心 服务注册与发现:微服务实例在启动时会向注册中心注册自己的信息&#xf…...

如何在微信搭建私域流量池?

A: ①给客户打标签 添加标签,多维度构建用户画像,精准发送消息。 ②群发信息 选择自定义时间,上传内容 (支持文字,图片) ,一键群发 。 ③建立专属素材库 将常用的话术、图片与文件录入至素材库,员工可随…...

MySQL原理(三)锁定机制(1)综述

一、介绍: 1、锁的本质 业务场景中存在共享资源,多个进程或线程需要竞争获取并处理共享资源,为了保证公平、可靠、结果正确等业务逻辑,要把并发执行的问题变为串行,串行时引入第三方锁当成谁有权限来操作共享资源的判…...

Qt知识点总结

将枚举类型转换为字符串 这里使用的在网络编程中&#xff0c;获取socket状态并显示的时候&#xff0c;遇到的一个问题 #include <QMetaEnum>// 将枚举类型转换为字符串 QMetaEnum metaEnum QMetaEnum::fromType<QAbstractSocket::SocketState>(); const char *c…...

什么是系统工程(字幕)13

0 00:00:00,670 --> 00:00:01,582 如果不加图 1 00:00:01,582 --> 00:00:02,130 怎么加 2 00:00:02,130 --> 00:00:03,225 我们来看一下 3 00:00:03,225 --> 00:00:03,590 你看 4 00:00:03,980 --> 00:00:06,720 右键点这个&#xff0c;添加元素 5 00:00:0…...

qt学习:Table widget控件

目录 头文件 实战 重新配置ui界面 添加头文件 在构造函数中添加初始化 显示方法 该实例是在sqlite项目上添加qt学习&#xff1a;QTSQL连接sqlite数据库增删改查-CSDN博客 头文件 #include <QTableWidgetItem> 实战 重新配置ui界面 用法介绍&#xff0c;可以双击…...

Android --- Content Provider是使用示例,通俗易懂

当两个应用程序之间需要共享数据时&#xff0c;可以通过 Content Provider 来实现。在这个示例中&#xff0c;我们将创建一个简单的 Content Provider&#xff0c;让 App_B 暴露人口总数的数据&#xff0c;并由 App_A 来获取这个数据。 首先&#xff0c;我们来创建一个简单的示…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...