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

Java设计模式详解:工厂模式

Java设计模式详解:工厂模式


文章目录

  • Java设计模式详解:工厂模式
  • 前言
  • 一、工厂模式是个啥?
  • 二、工厂模式怎么用?
  • 三、工厂模式啥时候用?
  • 四、工厂模式的优点
  • 总结


前言

今天咱们来聊聊设计模式中的一位重要成员——工厂模式。工厂模式,听起来好像是个生产东西的地方?没错,它在软件设计中就是一个生产对象的“工厂”。下面咱们就一起来揭开工厂模式的神秘面纱,看看它到底是个啥玩意儿。


一、工厂模式是个啥?

工厂模式是一种常用的设计模式,其核心思想是通过定义一个用于创建对象的接口,将对象的创建逻辑封装在工厂类中,使得客户端代码与具体的产品类解耦。通过这种方式,我们可以灵活地创建对象,而无需关心具体的实现细节。简单来说,就是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。

在Java中,我们使用接口或抽象类来定义工厂方法,然后在具体的子类中实现该方法来创建对象。这样做的好处是,当我们需要改变对象的创建方式时,只需要修改相应的工厂子类就可以了,而不需要修改使用这个对象的代码。

二、工厂模式怎么用?

下面我给大家举个简单的例子来说明工厂模式怎么用。假设我们要创建一个动物园,里面有各种动物,比如老虎、狮子、大熊猫等。我们可以定义一个“动物工厂”,通过这个工厂来创建不同的动物对象。

// 定义一个动物接口  
public interface Animal {  void makeSound();  
}  // 实现动物接口的老虎类  
public class Tiger implements Animal {  @Override  public void makeSound() {  System.out.println("老虎吼叫");  }  
}  // 实现动物接口的狮子类  
public class Lion implements Animal {  @Override  public void makeSound() {  System.out.println("狮子怒吼");  }  
}  // 动物工厂接口  
public interface AnimalFactory {  Animal createAnimal();  
}  // 老虎工厂类,实现动物工厂接口  
public class TigerFactory implements AnimalFactory {  @Override  public Animal createAnimal() {  return new Tiger();  }  
}  // 狮子工厂类,实现动物工厂接口  
public class LionFactory implements AnimalFactory {  @Override  public Animal createAnimal() {  return new Lion();  }  
}  // 测试代码  
public class FactoryTestDemo {  public static void main(String[] args) {  AnimalFactory tigerFactory = new TigerFactory();  Animal tiger = tigerFactory.createAnimal();  tiger.makeSound(); // 输出:老虎吼叫  AnimalFactory lionFactory = new LionFactory();  Animal lion = lionFactory.createAnimal();  lion.makeSound(); // 输出:狮子吼叫  }  
}

在这个例子中,我们定义了一个Animal接口和两个实现了这个接口的类Tiger和Lion。然后我们定义了一个AnimalFactory接口和两个实现了这个接口的工厂类TigerFactory和LionFactory。测试代码通过工厂类来创建动物对象,并调用它们的方法。这样,我们就实现了工厂模式。

三、工厂模式啥时候用?

那么,什么情况下我们应该使用工厂模式呢?主要应用于需要动态创建对象的场景。当你需要创建的对象种类繁多,且这些对象的创建逻辑复杂或可能频繁变动时,采用工厂模式将是一个明智的选择。

以下是一些具体的工厂模式应用场景示例:

  1. 游戏相关应用开发:
    在大型游戏项目中,角色的多样化、道具的丰富性以及场景的复杂性使得对象的创建变得尤为关键。使用工厂模式,我们可以轻松地创建和管理各种游戏对象,如角色、道具和场景等,从而简化代码结构,提高代码的可维护性。
  2. 数据库连接池管理:
    在数据库连接管理中,经常需要创建和销毁数据库连接。使用工厂模式,我们可以将数据库连接的创建逻辑封装在工厂类中,实现连接的统一管理,避免资源泄露和性能问题。
  3. 配置文件解析:
    对于需要读取和解析配置文件的系统,工厂模式同样适用。通过定义配置文件解析工厂,我们可以根据不同的配置文件格式或需求,动态创建相应的解析器对象,实现配置的灵活加载和解析。
  4. UI组件创建:
    在图形用户界面(GUI)开发中,UI组件的创建和管理是一个重要环节。通过工厂模式,我们可以将UI组件的创建逻辑与客户端代码分离,实现组件的动态创建和替换,提高UI的灵活性和可维护性。

四、工厂模式的优点

工厂模式的优点在于它降低了客户端代码与具体产品类之间的耦合度,使得代码更加灵活、可维护和可扩展。当产品类发生变化时,我们只需要修改相应的工厂子类,而无需修改客户端代码,从而降低了代码的修改成本。

  1. 降低耦合度:
    工厂模式有效地降低了客户端代码与具体产品类之间的耦合度。这意味着客户端代码无需直接依赖于具体的产品实现,而是通过工厂类来间接获取所需对象。这种解耦使得代码结构更加清晰,减少了类之间的直接依赖关系,从而提高了代码的可维护性和可扩展性。
  2. 提高可读性和可维护性:
    通过将对象的创建逻辑封装在工厂类中,客户端代码可以更加专注于业务逻辑的实现,而无需关心对象的创建细节。这使得代码更加简洁、清晰,提高了可读性。同时,当需要修改或扩展对象创建逻辑时,只需在工厂类中进行修改,而无需触及客户端代码,从而降低了维护成本。
  3. 增强灵活性和可扩展性:
    工厂模式使得添加新的产品类变得轻松自如。当需要创建新的对象类型时,只需实现相应的产品接口或继承抽象产品类,并创建一个对应的工厂子类即可。这种设计使得代码更加灵活,能够适应不断变化的需求。同时,由于客户端代码与具体产品类之间的解耦,添加新的产品类不会影响到已有的客户端代码,从而保证了系统的稳定性和可靠性。
  4. 简化代码结构:
    通过工厂模式的应用,我们可以将对象的创建过程统一管理,避免了在客户端代码中散落大量的创建逻辑。这有助于简化代码结构,使代码更加整洁、易于理解。

综上所述,工厂模式通过降低耦合度、提高可读性和可维护性、增强灵活性和可扩展性以及简化代码结构等方面的优势,为软件开发带来了显著的效益。在实际项目中,合理应用工厂模式可以有效提升代码质量和系统的整体性能。


总结

好了,今天关于工厂模式的分享就到这里啦。希望大家能够通过这个例子更好地理解工厂模式,并在实际开发中灵活运用。如果你还有其他问题或者想要了解更多关于设计模式的知识,欢迎在评论区留言或者私信我哦!

相关文章:

Java设计模式详解:工厂模式

Java设计模式详解:工厂模式 文章目录 Java设计模式详解:工厂模式前言一、工厂模式是个啥?二、工厂模式怎么用?三、工厂模式啥时候用?四、工厂模式的优点总结 前言 今天咱们来聊聊设计模式中的一位重要成员——工厂模式…...

Python爬虫:爬虫常用伪装手段

目录 前言 一、设置User-Agent 二、设置Referer 三、使用代理IP 四、限制请求频率 总结 前言 随着互联网的快速发展,爬虫技术在网络数据采集方面发挥着重要的作用。然而,由于爬虫的使用可能会对被爬取的网站造成一定的压力,因此&#…...

【数据结构】非线性结构---二叉树

1、树 1.1 树的相关概念 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点 非终端节点或分支节点&#…...

【战略前沿】与中国达成生产协议后,飞行汽车即将起飞

【原文】Flying cars edge towards takeoff after Chinese production deal 【作者】Thomas Macaulay 斯洛伐克公司KleinVision签署了一项协议,将大规模生产AirCar。 一辆获得航空认证的飞行汽车向商业化又迈出了一大步。 空中汽车的创造者KleinVision今天宣布出售…...

谷粒商城实战(007 压力测试)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第141p-第p150的内容 简介 安装jmeter 安装jmeter 使用中文 这样写就是200个线程循环100次 一共是2万个请求 介绍线程组 添加请求 可以是htt…...

使用CSS计数器,在目录名称前加上了序号,让目录看起来更加井然有序

目录(Text of Contents缩写为TOC),其实就是一篇文章的概要或简述。这好比,去书店买书,先是被这本书的标题所吸引,而后我们才会,翻开这本书目录,看看这本书主要是在讲些什么&#xff…...

SSH常见运维总结

1 -bash: ssh: command not found 解决办法:"yum install -y openssh-server openssh-clinets" 2 ssh登录时提示:Read from socket failed: Connection reset by peer. 原因:/etc/ssh/下没有ssh*key*文件 解决&…...

uni app 扫雷

闲来无聊。做个扫雷玩玩吧&#xff0c;点击打开&#xff0c;长按标记&#xff0c;标记的点击两次或长按取消标记。所有打开结束 <template><view class"page_main"><view class"add_button" style"width: 100vw; margin-bottom: 20r…...

MATLAB绘制堆叠填充图--巧用句柄

MATLAB绘制堆叠填充图–巧用句柄 目录 MATLAB绘制堆叠填充图--巧用句柄1. 主要原理讲解1.1 主要函数1.2 句柄原理 2. 绘图示例2.1 准备数据2.2 绘制堆叠填充图-使用句柄控制图形属性2.3 设置填充颜色和样式2.4 添加标题和标签2.5 绘图效果 3. 结语 堆叠填充图是一种常见的数据可…...

JQuery的定义

jQuery是一个js库&#xff0c;使用jQuery会比js简单一点 jQuery文件是一个自执行函数 jQuery文件是一个自执行函数 $传递的参数不同&#xff0c;效果也不同&#xff1a; 传递的是匿名函数&#xff0c;那$就是一个入口函数&#xff0c;传递的是一个字符串&#xff0c;那$就…...

【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09; 二、短作业优先调度算法&#xff08;SJF&#xff09; 三、高响应比优先调度算法&#xff08;HRRN&#xff09; 四、轮转调度算法&#xff08;RR&#xff09; 五、最早截至时间优先算法&#xff08;EDF&#…...

Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA-YOLO)

1、总体概述 基于深度学习的目标检测在常规条件的数据集可以获得不错的结果&#xff0c;但是在环境、场景、天气、照度、雾霾等自然条件的综合干扰下&#xff0c;深度学习模型的适应程度变低&#xff0c;检测结果也随之下降&#xff0c;因此研究在复杂气象条件下的目标检测方法…...

Mac电脑Jmeter集成到Jenkins,压测多个接口并生成测试报告

Jenkins支持的JDK版本17、21&#xff0c;通过java -version查看当前JDK版本&#xff0c;确认是否匹配 打开网址https://www.jenkins.io/download 点击下载&#xff0c;选择mac版本 commend空格打开终端&#xff0c;输入安装命令brew install jenkins 安装完成后输入brew servi…...

redis-Hash

一&#xff0c;应用场景 Redis hash 是一个string类型的field和value的映射表&#xff0c;hash特别适合用于存储对象。Set就是一种简化的Hash,只变动key,而value使用默认值填充。 可以将一个Hash表作为一个对象进行存储&#xff0c;表中存放对象的信息。 二&#xff0c;命令 H…...

Kubernetes kafka系列 | Strimzi 部署kafka-bridge

Strimzi kafka集群部署直通车 一、kafka bridge 介绍 Kafka Bridge 是 Apache Kafka 生态系统中的一个工具或组件&#xff0c;用于实现 Kafka 与其他系统或协议之间的通信或集成。Kafka 本身是一个分布式事件流平台&#xff0c;广泛用于构建实时数据流水线和流式应用程序。然而…...

AR和VR如何改变客户体验?

How AR and VR are transforming customer experiences&#xff1f; How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…...

微信小程序中实现埋点的方法

在小程序开发过程中,埋点是实现数据采集和用户行为分析的重要手段。通过埋点,我们可以获取用户在使用小程序时的各种操作信息,从而更好地了解用户行为特征,优化产品体验。下面将介绍如何在小程序中实现埋点,并通过代码示例进行说明。 一、埋点实现思路 小程序的埋点实现主要依…...

vue记事本渲染以及交互

以下是记事本的源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本</title><styl…...

Zookeeper中的脑裂

简单点来说&#xff0c;脑裂(Split-Brain) 就是比如当你的 cluster 里面有两个节点&#xff0c;它们都知道在这个cluster 里需要选举出一个 master。那么当它们两个之间的通信完全没有问题的时候&#xff0c;就会达成共识&#xff0c;选出其中一个作为 master。但是如果它们之间…...

【漏洞复现】金和OA XmlDeal.aspx XXE漏洞

0x01 产品简介 金和数字化智能办公平台(简称JC6)是一款结合了人工智能技术的数字化办公平台,为企业带来了智能化的办公体验和全面的数字化转型支持。同时符合国家信创认证标准,支持组织数字化转型,实现业务流程的数字化、智能化和协同化,提高企业竞争力。 0x02 漏洞概述…...

对比:React 还是 Vue

自己之前的开发栈一直是 Vue&#xff0c;对 Vue 的设计理念及底层实现原理算是颇有了解&#xff1b;随着公司技术迭代&#xff0c;近半年来开始接触&使用 React。 前面写了几篇关于 React 的文章&#xff0c;但大部分都是知识点以及开发过程问题的沉淀总结。 这篇文章想尝…...

ubuntu 20.04 SD 卡分区类型 msdos 改为 GPT 的方法

前言 默认 SD 卡分区是 FAT32 格式&#xff0c;为了用于嵌入式Linux ext4 文件系统&#xff0c;需要改为 ext4 文件系统&#xff0c;但是SD 卡分区类型默认是 msdos 类型&#xff0c;也就是 MBR 类型&#xff0c;不是 GPT 类型。 烧写 ext4 分区表&#xff0c;或者使用 ubuntu…...

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案&#xff0c;帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果 一、简单介绍 二、简单颜色反转效果实现原理 三、简单颜色反转效果案例实现简单步骤 四、注…...

【ELK+Kafka+filebeat分布式日志收集】部署filebeat和Kibana(三)

filebeat下载 官网:https://www.elastic.co/cn/downloads/beats/filebeat 或者 cd /opt wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz依次执行如下命令...

二.音视频编辑-媒体组合-播放

引言 当涉及到音视频编辑时&#xff0c;媒体资源的提取和组合是至关重要的环节。在iOS平台上&#xff0c;AVFoundation框架提供了丰富而强大的功能&#xff0c;使得媒体资源的操作变得轻松而高效。从原始的媒体中提取片段&#xff0c;然后将它们巧妙地组合成一个完整的作品&am…...

前端安全-面试题(2024)

1. 面试总结话术: 前端常见的安全问题主要包括以下几种: 跨站脚本攻击(XSS):攻击者通过在目标网站注入恶意脚本,当用户访问网站时,恶意脚本会被执行,从而窃取用户信息或进行其他恶意操作。这种攻击通常利用表单提交、URL参数等方式注入脚本。存储型 xss 恶意代码存在数…...

CVE-2022-29405 Apache Archiva任意用户密码重置漏洞分析

Apache Archiva是一套可扩展的Artifact Repository管理系统。它能够与Maven&#xff0c;Continuum和ANT等构建工具完美结合。Archiva提供的功能包括&#xff1a;远程Repository代理&#xff0c;基于角色的安全访问管理&#xff0c;Artifact分发、维护、查询&#xff0c;生成使用…...

ssm框架配置文件例子

emmm。。。。 就是说&#xff0c;正常ssm的配置文件长啥样&#xff1f; 就最基础的&#xff1f; 贴一下&#xff0c;备忘吧。 第一个&#xff1a;applicationContext.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http…...

maven构建项目报错:Failure to find com.microsoft.sqlserver:sqljdbc4:jar:4.0 in

背景 今天在项目里面查询sqlserver的数据库的时候&#xff0c;本地maven中引入依赖&#xff1a; <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependenc…...

江苏专业做网站的公司/小说推广平台有哪些

我们发现前四个操作可以用双向链表维护&#xff0c;而最后一个操作有一个限制就是1<k<n&#xff0c;所以可以用一个数组存在光标前面的数&#xff0c;每次维护一下前缀和就好 #include<stdio.h> #include<string.h> #include<algorithm> #define N 100…...

wordpress 支持手机6/专门代写平台

查看当前系统是否有安装ssh ssh localhost ssh: connect to host localhost port 22: Connection refused //没安装 安装 sudo apt-get install openssh-server 启动服务 sudo /etc/init.d/ssh start ps -e|grep ssh // 查看启动是否成功 ssh的配置方法 /etc/ssh/sshd_c…...

网站如何生成静态页面/软文案例大全

一&#xff1a;引言 数据驱动的编程方法可以根据不同的数据类型灵活的控制执行逻辑&#xff0c;但目前这种编程方法中并未引入调度技术&#xff0c;待执行的逻辑序列固定编码在执行程序中&#xff0c;虽然可以将数据与过程的对应关系抽取出来&#xff0c;单独放在数据库或者采…...

dede模板蓝色大气简洁企业网站模板/广州网站建设方案维护

我身边有一位特别热爱文学的朋友&#xff0c;他经常把写好的文章交给他人批阅&#xff0c;由于写的字数可能较多导致页数也比较得多&#xff0c;而且他还会将文档转换成pdf文件格式发给对方&#xff0c;因为pdf是打印论文&#xff0c;格式不走样的唯一方便格式。跨平台,任何支持…...

仿做静态网站多少钱/社交媒体营销案例

在SQL Server Management Studio中直接修改正在连接的表结构会出现改不了的情况&#xff0c;如下图 解决方法&#xff1b;工具-选项-设计器--阻止保存要求重新创建表的更改&#xff0c;去掉对勾--确定即可 转载于:https://www.cnblogs.com/sdusrz/p/4925614.html...

网络营销顾问是什么/seo服务套餐

Java 如何复制图片到剪切板呢? 下面是我做的一个软件: 项目源代码见附件 这里面就有"复制图片到剪切板"功能.核心方法如下: Java代码 /*** * 复制图片到剪切板 * param image */ public static void setClipboardImage(JFrame frame, final I…...