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

设计模式--工厂设计模式

什么是工厂模式?

工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化延迟到子类。通过工厂方法模式,我们可以在不修改现有代码的情况下引入新的产品类,从而实现更好的扩展性和可维护性。

示例:创建不同类型的形状对象

让我们通过一个简单的示例来理解工厂模式。假设我们需要创建不同类型的形状对象,比如圆形(Circle)、矩形(Rectangle)和正方形(Square)。

第一步:定义形状接口

首先,我们定义一个形状接口(Shape),所有具体的形状类都实现这个接口。

public interface Shape {void draw();
}

 

第二步:创建具体的形状类

接下来,我们创建实现 Shape 接口的具体形状类,例如 CircleRectangleSquare

public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Square");}
}
第三步:创建抽象工厂类

我们创建一个抽象工厂类(ShapeFactory),定义一个工厂方法 createShape,由子类实现具体的创建逻辑。

public abstract class ShapeFactory {public abstract Shape createShape();
}
第四步:创建具体工厂类

然后,我们为每种形状创建对应的工厂类,实现工厂方法 createShape

public class CircleFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class RectangleFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}public class SquareFactory extends ShapeFactory {@Overridepublic Shape createShape() {return new Square();}
}
第五步:使用工厂类创建形状对象

最后,我们在客户端代码中使用具体的工厂类来创建不同的形状对象。

public class Client {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();Shape shape1 = circleFactory.createShape();shape1.draw();ShapeFactory rectangleFactory = new RectangleFactory();Shape shape2 = rectangleFactory.createShape();shape2.draw();ShapeFactory squareFactory = new SquareFactory();Shape shape3 = squareFactory.createShape();shape3.draw();}
}
工厂模式的优点
  1. 解耦:工厂模式将对象的创建和使用解耦,客户端代码不需要知道具体类名,只需与工厂类和接口/抽象类交互。
  2. 扩展性:添加新类型的产品类时,只需增加相应的具体工厂类,无需修改现有代码,符合开闭原则(Open/Closed Principle)。
  3. 灵活性:通过工厂方法的重载或重写,可以灵活地控制对象创建的过程。
工厂模式的缺点
  1. 类的数量增加:每增加一种产品类,都需要增加相应的具体工厂类,导致类的数量增加。
  2. 复杂性:相对于简单工厂模式,工厂模式的结构更复杂,需要额外定义工厂类。
总结

工厂模式通过定义创建对象的接口,将对象的实例化延迟到子类,从而实现了解耦和扩展性。尽管其结构相对复杂,但在需要灵活创建对象且可能频繁变更的场景中,工厂模式是一种非常有用的设计模式。希望通过这个示例,你能更好地理解和应用工厂模式,让你的代码更加优雅和高效。

相关文章:

设计模式--工厂设计模式

什么是工厂模式? 工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化延迟到子类。通过工厂方法模式,我们可以在不修改现有代码的情况下…...

消息队列-MQ

消息队列-MQ 1、什么是MQ?为什么要使用MQ?2、MQ有什么优缺点?3、有哪些常见的MQ实现?都有什么区别?4、MQ如何保证消息的可靠传输?消息丢了怎么办?5、如何保证消息的顺序性?6、如何解决消息队列的延时以及过期失效问题?7、消息队列满了以后该怎么处理?8、假设有几百万…...

近源渗透简介

什么是近源渗透 通过乔装、社工等方式实地物理侵入企业办公区域,通过其内部各种潜在攻击面(如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等)获得“战果”,最后以隐秘的方式将评估结果带出上报,由此证明企业安全防…...

13 IP层协议-网际控制报文协议ICMP

计算机网络资料下载:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/140148186 为了更有效的转发IP数据报和提高交付成果的机会,在网际层使用了网际控制报文协议ICMP。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP不是高层协议数…...

第一节Linux常见指令

目录 1.Linux下基本指令 ls指令 pwd 命令 cd 指令 知识点:理解树形结构 touch 指令 mkdir指令(重要) rmdir指令 && rm指令(重要) 知识点:ls file* 可以找到当前目录下任何以file开头的文件​编辑 知识点:热键 man指令()重要 补充知识点:nano cp…...

嵌入式全栈设计思路:STM32G4+ChibiOS+FreeRTOS+PID控制+PFC算法构建高效智能电源管理系统(附代码示例)

智能电源管理系统是一个基于STM32G4微控制器的高性能数字电源控制解决方案。本项目旨在设计一个功能全面、高效稳定的电源管理系统,可广泛应用于工业控制、新能源、通信设备等领域。 1.1 系统主要特点 高精度数字电源控制:利用STM32G4的高性能ADC和定时器,实现精确…...

Linux驱动开发-04LED灯驱动实验(直接操作寄存器)

一、Linux 下LED 灯驱动原理 Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。驱动访问底层的硬件除了使用内存映射将物理地址空间转化为虚拟地址空间,去进行读写修改,还可以通过各种子系统函数去进行操作 1.1 地址映射 MMU 全称…...

Linux命令更新-sort 和 uniq 命令

简介 sort 和 uniq 都是 Linux 系统中常用的文本处理命令。 sort 命令用于对文件内容进行排序。 uniq 命令用于去除文件中重复出现的行。 1. sort 命令 命令格式 sort [选项] [文件]选项: -n: 按照数字进行排序 -r: 反向排序 -c: 统计每个元素出现的次数 -…...

【密码学】密码学数学基础:剩余系

不得不啃的密码学数学基础之剩余系是个啥?数学里面有好多的定义都有前置的数学概念,要想弄懂剩余系还得先说说“同余”。 一、同余 那么“同余”有是个什么呢?在谈论“同余”之前,我们先圈定个讨论的范围。接下来讨论的都是整数集…...

量化发展历史简述,QMT/PTrade+恒生UFT、LDP极速柜台适用哪些情形?

量化发展简述 1.2004年萌发阶段:策略局限在量化择时,量化选股等; 光大保德信量化核 心基金 上投摩根阿尔法基 金 金融危机,海归引入。 2.2010量化元年:中低频交易为主,主要依靠套利、对冲、多因子策略等…...

linux服务器anaconda安装及环境变量配置

1.下载anaconda Index of /可以在此链接中下载所需要的anaconda安装文件。使用一下的命令进行下载: wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh2.安装anaconda 进入到下载的目录下,使用下面的的命令进行安装&#…...

如何在 Objective-C 中实现多态性,并且它与其他面向对象编程语言的多态性实现有何差异?

在Objective-C中,多态性可以通过使用父类的指针来调用子类的方法来实现。具体来说,可以定义一个父类的指针,然后将子类的实例赋值给这个指针。这样,即使使用父类的指针来调用方法,实际上会调用子类的方法。 需要注意的…...

阿里云OSS简单应用

前提条件 购买OSS标准存储包之后,就可以使用OSS的各种服务了 1 获取自己的OSS Endpoint OSS访问域名和数据中心_对象存储(OSS)-阿里云帮助中心 在官方的表格上找到自己OSS标准存储包对应的外网Endpoint即可 2 创建自己的阿里云Access Key ID 和 Access Key Secret …...

cleanshot Mac 上的截图工具

笔者闲来无事,最近在找一些mac上好用的工具其中一款就是cleanShot。为什么不用原有的mac自带的呢。因为相对来说编辑功能不算全面,不支持长截图。那有没有一款软件支持关于截图的好用工具呢。 所以笔者找了这款。安装包是直接安装就可使用的。请大家点赞…...

JMeter进行HTTP接口测试的技术要点

参数化 用户定义的变量 用的时候 ${名字} 用户参数 在参数列表中传递 并且也是${} csv数据文件设置 false 不忽略首行 要首行 从第一行读取 true 忽略首行 从第二行开始 请求时的参数设置: 这里的名称是看其接口需要的请求参数的名称 这里的变量名称就是为csv里面…...

基于智能算法的品牌视觉识别系统优化研究

基于智能算法的品牌视觉识别系统优化研究 一、引言 随着人工智能技术的快速发展,智能算法在各个领域的应用日益广泛。在品牌视觉识别系统中,智能算法同样发挥着重要作用。品牌视觉识别系统(Visual Identity System,简称VIS)是企业通过统一的视觉符号系统,将企业的理念、…...

递归锁与普通锁的区别

什么是锁? 在多线程编程中,锁是一种机制,用来确保某些代码块在同一时间只能被一个线程执行。想象一下,你和你的朋友们都想同时进入一个只有一把椅子的房间。为了避免混乱,你们需要一个锁来控制进入的顺序。 普通锁&a…...

FPGA上板项目(二)——PLL测试

目录 实验内容实验原理实验步骤实验结果 实验内容 将差分时钟信号转化为 192MHz 时钟信号作为输出。 实验原理 PLL,即锁相环,一种反馈控制电路,具有时钟倍频、分频、相位偏移和可编程占空比的功能。 实验步骤 添加 clocking wizard IP核&…...

C语言 | Leecode C语言题解之第229题多数元素II

题目: 题解: /*** Note: The returned array must be malloced, assume caller calls free().*//*假定 num1,num2 为出现次数大于 nums.length / 3 的两个数。(最多出现两个)遍历 nums, 若出现 num1、num2…...

mybatis-plus映射mysql的json类型的字段

一、对json里面内容建立实体类 Data AllArgsConstructor NoArgsConstructor public class RouteMetaEntity {private String title;private Boolean affix;private Boolean isAlwaysShow; }二、主类做映射 TableField(typeHandler JacksonTypeHandler.class)private RouteMe…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

在Zenodo下载文件 用到googlecolab googledrive

方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!&#xff0…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...