设计模式--工厂设计模式
什么是工厂模式?
工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化延迟到子类。通过工厂方法模式,我们可以在不修改现有代码的情况下引入新的产品类,从而实现更好的扩展性和可维护性。
示例:创建不同类型的形状对象
让我们通过一个简单的示例来理解工厂模式。假设我们需要创建不同类型的形状对象,比如圆形(Circle)、矩形(Rectangle)和正方形(Square)。
第一步:定义形状接口
首先,我们定义一个形状接口(Shape),所有具体的形状类都实现这个接口。
public interface Shape {void draw();
}
第二步:创建具体的形状类
接下来,我们创建实现 Shape
接口的具体形状类,例如 Circle
、Rectangle
和 Square
。
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();}
}
工厂模式的优点
- 解耦:工厂模式将对象的创建和使用解耦,客户端代码不需要知道具体类名,只需与工厂类和接口/抽象类交互。
- 扩展性:添加新类型的产品类时,只需增加相应的具体工厂类,无需修改现有代码,符合开闭原则(Open/Closed Principle)。
- 灵活性:通过工厂方法的重载或重写,可以灵活地控制对象创建的过程。
工厂模式的缺点
- 类的数量增加:每增加一种产品类,都需要增加相应的具体工厂类,导致类的数量增加。
- 复杂性:相对于简单工厂模式,工厂模式的结构更复杂,需要额外定义工厂类。
总结
工厂模式通过定义创建对象的接口,将对象的实例化延迟到子类,从而实现了解耦和扩展性。尽管其结构相对复杂,但在需要灵活创建对象且可能频繁变更的场景中,工厂模式是一种非常有用的设计模式。希望通过这个示例,你能更好地理解和应用工厂模式,让你的代码更加优雅和高效。
相关文章:

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

消息队列-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…...

20240716 Codeforces题目
A - Split the Multiset 题目 多集是一组数字,其中可以有相等的元素,数字的顺序无关紧要。例如, { 2 , 2 , 4 } \{2,2,4\} {2,2,4} 是一个multiset。 你有一个多集 S S S 。最初,multiset只包含一个正整数 n n n 。即 S {…...

29.【C语言】自定义函数
1、自定义详解 *提示:先看第12,19篇 例:写一个程序交换两个变量的值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void swap(int x, int y) {int z 0;z x;x y;y z; } int main() {int a 10;int b 20;swap(a, b);printf("%d…...

C++面向对象编程 基础篇(3)函数基础
3、函数基础 3.1 函数默认参数 在C中,函数的形参列表中的形参是可以有默认值的 注意事项: 如果某个位置已经有了默认参数,往后的形参都要有默认参数 函数声明和函数实现只能有一个有默认参数 示例: //如果自己传入参数&…...

excel有条件提取单元格特定文本(筛选纯文字的单元格或含有数字的单元格、单元格提取不同的文本长度)
实际工作背景 需要对导出的银行流水中的数十个村以及对应的村小组进行分组统计,但是初始的表格中村和小组是混在一起的,如下图所示: 目的:将大树村和大树村小组名称分别筛选出来 1.观察发现,大树村小组的单元格第4…...

HBase 在统一内容平台业务的优化实践
作者:来自 vivo 互联网服务器团队-Leng Jianyu、Huang Haitao HBase是一款开源高可靠性、扩展性、高性能和灵活性的分布式非关系型数据库,本文围绕数据库选型以及使用HBase的痛点展开,从四个方面对HBase的使用进行优化,取得了一些…...

【异常解决】Unable to start embedded Tomcat Nacos 启动报错
Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos(2.2.0) 服务,控制台报错 Unable to start embedded Tomcat。 报错信息:Unable to start …...

【Java面向对象】对象和类
文章目录 1.为对象定义类2.定义类2.1 主类 3.类与对象3.1 构造方法3.2 通过引用变量访问对象3.3 访问对象的数据和方法3.4 引用数据域和 null 值3.5 基本类型变量和引用类型变量的区别 4.常见的类 1.为对象定义类 面向对象程序设计(OOP) 就是使用对象进行程序设计。对象 (obje…...

在微服务架构架构中父工程中的`<dependencyManagement>`和 `<dependencies>`的区别
在微服务架构架构中父工程中的<dependencyManagement>和 <dependencies>的区别: 在微服务架构中,通常会有一个父工程(或称作聚合工程)来管理一组相关的子模块(即各个微服务)。Maven 的 <de…...

Docker安装Zookeeper、RocketMQ
安装Zookeeper 拉取镜像 docker pull zookeeper:3.9.2启动容器 -d后台启动,-p映射容器2181端口到宿主机2181端口,限制容器最大内存占用为128m,–restart容器自动重启 docker run -d -p 2181:2181 -m 128m --restartalways --name zookeepe…...

Ubuntu 磁盘扩容
1.下载工具 sudo apt-get install gparted 2.调整大小...