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

设计模式之是简单工厂模式

分类

设计模式一般分为三大类:创建型模式、结构型模式、行为型模式。

  1. 创建型模式:用于创建对象,共五种,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  2. 结构型模式:用于处理类或对象的组合,共七种,包括适配器模式、装饰者模式、代理模式、门面模式、桥梁模式、组合模式、享元模式。
  3. 行为型模式:用于描述类或对象怎样交互以及怎样分配职责,共十一种,包括策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

今天主角是简单工厂模式,是工厂模式的一种,属于创建型的设计模式。

定义

简单工厂模式是一种属于创建型模式的设计模式,又叫做静态工厂方法(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…...

像素剧本圣殿新手指南:RPG对话框系统理解AI输出逻辑与修改技巧

像素剧本圣殿新手指南:RPG对话框系统理解AI输出逻辑与修改技巧 1. 认识像素剧本圣殿的RPG对话框系统 像素剧本圣殿的RPG对话框系统是其最具特色的交互界面,它模拟了经典像素游戏中NPC对话的场景。这个系统不仅仅是视觉上的复古设计,更是AI剧…...

哈工大深圳LaTeX论文模板:5分钟搞定专业学位论文排版的终极方案

哈工大深圳LaTeX论文模板:5分钟搞定专业学位论文排版的终极方案 【免费下载链接】hitszthesis A dissertation template for Harbin Institute of Technology, ShenZhen (HITSZ), including bachelor, master and doctor dissertations. 项目地址: https://gitcod…...

[Redis小技巧30]RedLock 深度剖析:从算法原理到“时钟漂移”的致命缺陷

在分布式系统的浩瀚海洋中,互斥性是保证数据一致性的基石。当我们谈论分布式锁时,通常首先想到的是基于单节点 Redis 的实现——利用 SET key value NX PX timeout 命令。这种方案简单、高效,足以应对 90% 的业务场景。 然而,单节…...

IDEA使用maven打包Java项目,跳过test的3种方法

文章目录第一种&#xff1a;命令行第二种&#xff1a;pom.xml设置第三种&#xff1a;IDEA工具操作第一种&#xff1a;命令行 命令行的方式&#xff0c;在哪输入命令都行。 mvn install -Dmaven.test.skiptrue第二种&#xff1a;pom.xml设置 修改pom.xml文件 <build>&…...

别只盯着错误页!从一次线上事故复盘:优化微信小程序web-view体验的5个隐藏细节

从线上事故到极致体验&#xff1a;微信小程序web-view优化的5个实战细节 那天凌晨3点&#xff0c;我被一阵急促的告警声惊醒。监控系统显示&#xff0c;公司核心小程序的H5活动页加载成功率从99.8%暴跌至62%。这个承载着双十一预售活动的页面&#xff0c;每小时流失着数百万潜在…...

OWL ADVENTURE惊艳案例:风格迁移与艺术画作生成

OWL ADVENTURE惊艳案例&#xff1a;风格迁移与艺术画作生成 每次看到那些世界名画&#xff0c;你是不是也想过&#xff0c;要是能把自己的照片也变成那样该多好&#xff1f;以前这得靠专业画师花上好几天&#xff0c;现在&#xff0c;有了OWL ADVENTURE这样的AI模型&#xff0…...

3步实现Web界面设计标注高效交付:面向全栈团队的Sketch Measure应用指南

3步实现Web界面设计标注高效交付&#xff1a;面向全栈团队的Sketch Measure应用指南 【免费下载链接】sketch-measure Make it a fun to create spec for developers and teammates 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-measure 在Web开发项目中&#x…...

考研党必看!用Notion+Obsidian打造你的线性代数矩阵复习神器(附模板)

考研党必看&#xff01;用NotionObsidian打造你的线性代数矩阵复习神器&#xff08;附模板&#xff09; 线性代数作为考研数学的重要部分&#xff0c;矩阵理论更是其中的核心难点。传统的纸质笔记虽然直观&#xff0c;但难以实现知识点的快速检索、动态更新和跨章节关联。本文将…...

Qwen3-14B私有化效果闭环:从部署→使用→反馈→迭代的完整链路

Qwen3-14B私有化效果闭环&#xff1a;从部署→使用→反馈→迭代的完整链路 1. 开箱即用的私有化部署方案 Qwen3-14B作为通义千问系列的最新大语言模型&#xff0c;在14B参数规模下展现出惊人的理解与生成能力。但对于企业用户而言&#xff0c;如何在自有环境中实现稳定、高效…...

5大核心能力解析:YimMenu如何重塑GTA5游戏体验与安全防护

5大核心能力解析&#xff1a;YimMenu如何重塑GTA5游戏体验与安全防护 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/Y…...