wordpress访问显示502/名词解释seo
分类
设计模式一般分为三大类:创建型模式、结构型模式、行为型模式。
- 创建型模式:用于创建对象,共五种,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式:用于处理类或对象的组合,共七种,包括适配器模式、装饰者模式、代理模式、门面模式、桥梁模式、组合模式、享元模式。
- 行为型模式:用于描述类或对象怎样交互以及怎样分配职责,共十一种,包括策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
今天主角是简单工厂模式,是工厂模式的一种,属于创建型的设计模式。
定义
简单工厂模式是一种属于创建型模式的设计模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式的核心是一个工厂类,它负责实现创建所有产品实例的内部逻辑。这个工厂类提供了一个或多个静态的工厂方法,根据参数的不同返回不同类的实例。这些被创建的实例通常都具有共同的父类。
简单工厂模式
- Factory(工厂角色)
工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。
- Product(抽象产品角色)
抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
- ConcreateProduct(具体的产品类)
具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法 。
示例
这里也使用女娲造人的传说来演示一下简单工厂模式的使用过程,这里女娲本身实际上就是一个造人的工厂,可以造男人、造女人。
UML类图如下
伪代码演示如下:
public interface Human {/*** 人类会吃东西*/void eat();/*** 人类会喝东西*/void drink();
}
public class Man implements Human{@Overridepublic void eat() {System.out.println("男人一般比较喜欢吃肉");}@Overridepublic void drink() {System.out.println("男人一般比较喜欢喝酒");}
}
public class Woman implements Human{@Overridepublic void eat() {System.out.println("女人一般都比较喜欢吃甜食");}@Overridepublic void drink() {System.out.println("女人一般都比较喝红酒");}
}
public class HumanFactory {public static Human create(Integer humanType){Human human=null;switch (humanType){case 0:human=new Woman();break;case 1:human=new Man();break;default:break;}return human;}public static void main(String[] args) {Human human = HumanFactory.create(1);human.eat();human.drink();Human woman = HumanFactory.create(0);woman.eat();woman.drink();}
}
到21世纪了,现代社会的“女娲”,如果除了会造正常的男人、女人外,还会造机器人,怎么办呢?使用简单工厂方法就很简单,
1、增加一个机器人类
2、再修改一下工厂类的造人方法;
Uml类图:
伪代码演示如下:
public class Robot implements Human{@Overridepublic void eat() {System.out.println("机器人不用吃东西");}@Overridepublic void drink() {System.out.println("机器人不用喝东西");}
}
public class HumanFactory {public static Human create(Integer humanType){Human human=null;switch (humanType){case 0:human=new Woman();break;case 1:human=new Man();break;case 2:human=new Robot();default:break;}return human;}public static void main(String[] args) {Human human = HumanFactory.create(1);human.eat();human.drink();Human woman = HumanFactory.create(0);woman.eat();woman.drink();Human robot = HumanFactory.create(2);robot.eat();robot.drink();}
}
应用场景
工厂模式是一种创建型模式,它允许你创建对象,而不必指定这些对象的类。这使得你可以在程序运行时动态地创建对象,如果一个类有多个子类,并且这些子类的创建过程比较复杂,那么使用工厂模式可以使得代码更加简洁,易于维护。
举一个例子,假设有一个订单支付功能,有两种支付方式:支付宝支付和微信支付。用户在客户端进行支付时,需要从这两种支付方式中选取一种,进行支付操作。在这种情况下,可以创建一个简单工厂模式来决定创建出哪一种支付方式的实例。
需要注意的是,虽然简单工厂模式在一定程度上降低了代码的复杂度,但在实际应用中,如果需要根据不同的条件创建不同的对象,或者需要在运行时动态地创建对象,或者需要对对象的创建过程进行复杂的控制,那么可能需要使用更复杂的工厂模式,例如工厂方法模式或者抽象工厂模式等。
总结
优点:
- 易于扩展:由于简单工厂模式中工厂类的方法是静态的,所以可以在不修改原有代码的基础上增加新的产品类,只需要在新的产品类中实现工厂类所定义的接口即可。
- 代码简洁:简单工厂模式将对象的创建和使用分离,使得代码更加清晰简洁,易于维护。
- 单一职责:工厂类只负责创建对象,没有其他的职责,这使得代码更加单一,职责明确。
缺点:
- 违反了“开闭原则”:在简单工厂模式中,如果要增加新的产品类,就需要修改工厂类,这违反了“开闭原则”。
- 难以扩展:由于简单工厂模式中的工厂类是静态的,所以不能通过继承来实现多态。这使得该模式难以扩展到大型的应用中。
- 依赖性强:由于简单工厂模式中的工厂类负责创建所有的产品对象,因此对产品类的实现有很强的依赖性。如果产品类的实现发生了改变,就需要修改工厂类。
建议
如果想要学会设计模式、用好设计模式,建议先从UML类图开始学,UML类图中不同的箭头和线条,代表的意义是不同的,这里简单的梳理了一下,如果需要可以移步这里:设计模式之基础:UML类图怎么看?_uml图怎么看-CSDN博客
相关文章:

设计模式之是简单工厂模式
分类 设计模式一般分为三大类:创建型模式、结构型模式、行为型模式。 创建型模式:用于创建对象,共五种,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式:用于处理类或对…...

Java应用的混淆、加密以及加壳
文章目录 前言问题代码混淆存在的问题Java类文件加密存在的问题虚拟化保护存在的问题AOT编译存在的问题 Java应用的打包混淆器类加载与类加密Bootstrap Class LoaderExtension Class LoaderSystem Class Loader自定义ClassLoaderprotector4j 加壳采用Golang打包Java程序xjar 参…...

【Linux】:Linux中Shell命令及其运行原理/权限的理解
Shell命令以及运行原理 Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通…...

传统项目管理与敏捷项目管理
价值理念 首先来看看在理念方面,两者有何不同。 项目管理的铁三角是围绕着范围、成本和时间展开的。传统项目管理的特点是强计划驱动,需求范围固定下来后才可分配人员和时间,并在项目推进过程中积极跟踪和控制风险。 敏捷项目…...

只要掌握Win32应用程序错误的来龙去脉,就没必要惊慌失措
也许你遇到了一个问题,你试图运行的程序已损坏甚至丢失。在这种情况下,Windows将无法正确运行该文件,因此,操作系统将生成一个错误——文件不是有效的32位应用程序或文件不是无效的Win32应用程序。 错误通常是因为可执行文件不是有…...

ABB机器人关于重定位移动讲解
关于机器人如何重定位移动,首先来看一下示教器上的重定位移动是在哪。 从图中所示的坐标位置和操纵杆方向得知,重定位的本质是绕X、Y、Z轴的旋转。那么实现跟摇杆一样的操作,就可以通过改变当前位置的欧拉角来实现,参考Rapid指令…...

Ceph介绍与部署
Ceph介绍与部署 一、存储基础1.1、单机存储设备1.1.1、单机存储的问题 1.2、商业存储解决方案1.3、分布式存储(软件定义的存储 SDS)1.3.1、分布式存储的类型 二、Ceph 简介三、Ceph 优势四、Ceph 架构五、Ceph 核心组件5.1、Pool中数据保存方式支持两种类…...

sklearn 机器学习基本用法
# # 科学计算模块 # import numpy as np # import pandas as pd # # 绘图模块 # import matplotlib as mpl # import matplotlib.pyplot as plt # from sklearn.linear_model import LinearRegression # from sklearn import datasets # from sklearn.model_selection import t…...

Ionic4 生命周期钩子函数和angular生命周期钩子函数介绍
1、Ionic4 生命周期钩子函数 Ionic 4(以及之后的 Ionic 版本)使用了 Angular 生命周期钩子,因为 Ionic 是基于 Angular 构建的。因此,Ionic 4 中的生命周期与 Angular 组件生命周期非常相似。以下是一些常见的 Ionic 4 生命周期钩…...

Hive+Flume+Kafka章节测试六错题总结
题目2: EXTERNAL关键字的作用?[多选] A、EXTERNAL关键字可以让用户创建一个外部表 B、创建外部表时,可以不加EXTERNAL关键字 C、通过EXTERNAL创建的外部表只删除元数据,不删除数据 D、不加EXTERNAL的时候,默认创建内…...

【随笔】论多线程CPU离线渲染器的实现:A CPU BASED OFFLINE RENDERING ENGINE
前言 小熊挺喜欢玩游戏的,对于游戏画面有所追求,记得高中第一次玩战地的时候,惊叹于画面细腻的表现,并且还能开坦克车,这样的事情深深吸引了我。我是一个画面党,为了追求更好的画质表现我开始研究设置面板…...

多输入多输出 | MATLAB实现CNN-GRU-Attention卷积神经网络-门控循环单元结合SE注意力机制的多输入多输出预测
多输入多输出 | MATLAB实现CNN-GRU-Attention卷积神经网络-门控循环单元结合SE注意力机制的多输入多输出预测 目录 多输入多输出 | MATLAB实现CNN-GRU-Attention卷积神经网络-门控循环单元结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果…...

Ubuntu:Arduino IDE 开发环境配置【保姆级】
物联网开发学习笔记——目录索引 本章主要介绍在Ubuntu系统搭建Arduino IDE 开发环境,windows系统请移步:Windows:Arduino IDE 开发环境配置【保姆级】 参考官网:Arduino - Home 有关更多详细信息,请参阅 Arduino I…...

Kafka 开启SASL/SCRAM认证 及 ACL授权(三)验证
Kafka 开启SASL/SCRAM认证 及 ACL授权(三)验证。 官网地址:https://kafka.apache.org/ 本文说明如何做client验证ACL是否生效,我们之前开启了无acl信息不允许访问的配置。涉及的client有以下几个场景:shell脚本、python脚本、java应用、flink流。 kafka shell script验证…...

Pycharm 2023 设置远程调试
pycharm 版本 : 2023.2.1 整体流程参考:https://blog.csdn.net/xuanhaolaile/article/details/128293254 首先确定远程服务器上已经安装好 requirements.txt 中所需的依赖包。 1、SSH Configurations 添加远程服务器 2、Python Interpreter 注意&…...

asp.net core在其他程序集获取HttpContext
首先在Program.cs中,注册 builder.Services.AddHttpContextAccessor();Program.cs完整代码: using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Text.Encodings.Web; using System.Text.Unicode; us…...

UWB NI框架嵌入式实现——Qorvo示例
在Qorvo提供的DW3000示例代码中,实现了与Apple的NI框架的互通的示例,本文中针对其示例程序进行简要的分析。测试中使用Qorvo提供的模块,该模块为nRF52833DW3000的架构。 1. Qorvo相关库文件 Qorvo在提供示例时,仅提供了相关的库文…...

Linux OS源的问题记录
场景 安装了一台Linux虚拟机充当服务器,准备搭建一个elk环境,我使用命令安装docker的时候,报错提示 YumRepo Error: All mirror URLs are not using ftp, http[s] or file.Eg. Invalid release/repo/arch combination/ removing mirrorlist…...

数据库:Hive转Presto(五)
此篇将所有代码都补充完了,之前发现有的代码写错了,以这篇为准,以下为完整代码,如果发现我有什么考虑不周的地方,可以评论提建议,感谢。代码是想哪写哪,可能比较繁琐,还需要优化。 …...

SQL中for xml path 的用法
1. 用法 是一种将查询结果转换为 XML 格式的方法。它可以将查询结果中的每一行转换为一个 XML 元素,并且可以指定元素的名称和属性。 2. 应用示例 有一张学生选修课程的表,如下图所示 希望整合成下图所示效果 --建表 if object_id(StudentInfo,u) is…...

【TensorFlow2 之014】在 TF 2.0 中实现 LeNet-5
一、说明 在这篇文章中,我们将展示如何在 TensorFlow 中实现像 \(LeNet-5\) 这样的基础卷积神经网络。LeNet-5 架构由 Yann LeCun 于 1998 年发明,是第一个卷积神经网络。 数据黑客变种rs 深度学习 机器学习 TensorFlow 2020 年 2 月 29 日 | 0 …...

【2023】redis-stream配合spring的data-redis详细使用(包括广播和组接收)
目录 一、简介1、介绍2、对比 二、整合spring的data-redis实现1、使用依赖2、配置类2.1、配置RedisTemplate bean2.2、异常类 3、实体类3.1、User3.2、Book 4、发送消息4.1、RedisStreamUtil工具类4.2、通过延时队列线程池模拟发送消息4.3、通过http主动发送消息 5、dz…...

飞书应用机器人文件上传
背景: 接上一篇 flask_apscheduler实现定时推送飞书消息,当检查出的异常结果比较多的时候,群里会有很多推送消息,一条条检查工作量会比较大,且容易出现遗漏。 现在需要将定时任务执行的结果记录到文件,…...

高版本Mac系统如何打开低版本的Xcode
这里写目录标题 前言解决方案 前言 大家偶尔也碰见过更新Mac系统后经常发现低版本的Xcode用不了的情况吧.基本每年大版本更新之后都可以在各个开发群里碰见问这个问题的. 解决方案 打开访达->应用程序->选中打不开的那个版本的Xcode并且右键显示包内容->Contents-…...

测试H5需要注意的交互测试用例点
H5(HTML5)是一种用于构建网页的标准,可以实现丰富的交互和功能。测试H5交互通常涉及到验证网页在各种情况下的行为,包括用户输入、按钮点击、页面加载等等。以下是一些可能的H5交互测试用例: 页面加载: 验…...

1014蓝桥算法双周赛,学习算法技巧,助力蓝桥杯
家人们,我来免费给大家送福利了!!! 【1014蓝桥算法双周赛 】 背景 蓝桥杯全国软件和信息技术专业人才大赛是由工业和信息化部人才交流中心举办的全国性IT学科赛事。参赛高校超过1200余所,累计参赛人数超过40万人。该…...

C语言之通讯录的实现篇
目录 test.c 主菜单menu 创建通讯录con 初始化通讯录InitContact 增加个人信息AddContact 展示个人信息ShowContact 删除个人信息DelContact 查找个人信息SearchContact 修改个人信息ModifyContact test.c总代码 contact.h 头文件包含 PeoInfo_个人信息的设置声…...

如何降低海康、大华等网络摄像头调用的高延迟问题(二)
目录 1.RTSP介绍 2.解决办法1 3.解决办法2 1.RTSP介绍 RTSP(Real-time Streaming Protocol)是一种用于实时流媒体传输的网络协议。它被设计用于在服务器和客户端之间传输音频、视频以及其他流媒体数据。 RTSP协议允许客户端通过与服务器建立RTSP会话…...

centos清理日志和缓存
今天使用redmine修改密码,修改报错,再去试试创建用户,创建用户的页面直接报错显示不出来。然后看了一下服务器,发现服务器磁盘空间全部占满了。 CentOS系统也会在使用很长一段时间后出现硬盘空间开始不够的情况,而这并…...

排序算法的稳定性
什么是排序算法的稳定性? 排序算法的稳定性: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i] r[j],且 r[i…...