设计模式之简单工厂模式
一、概述
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。
简单工厂模式:又叫做静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品类的实例。
二、适用性
1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化的时候。
三、参与者
1.Product定义工厂方法所创建的对象的接口或抽象类。
2.ProductA和ProductB实现Product接口。
3.Factory工厂类声明工厂方法,该方法返回一个Product类型的对象。 Factory也可以定义一个工厂方法的缺省实现,它返回一个缺省的Product对象。 它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法createProduct()可以被外界直接调用,创建所需的产品对象。
4.Client客户端,调用工厂类的createProduct()方法来创建产品实例。
四、类图

五、示例
Product接口或抽象类
public abstract class Product {protected abstract void work();
}public interface Product {void work();
}
TeacherWork
public class TeacherWork extends Product {@Overrideprotected void work() {System.out.println("老师审批作业!");}
}
StudentWork
public class StudentWork extends Product {@Overrideprotected void work() {System.out.println("学生做作业!");}
}
SimpleFactory
public class SimpleFactory {public Product create(String type) {Product product = null;if (type.equals("teacher")) {product = new TeacherWork();} else if (type.equals("student")) {product = new StudentWork();}return product;}
}
Test
@Test
public void test(){SimpleFactory simple = new SimpleFactory();Product product = simple.create("student");product.work();
}
测试结果
Connected to the target VM, address: '127.0.0.1:1742', transport: 'socket'
学生做作业!
Disconnected from the target VM, address: '127.0.0.1:1742', transport: 'socket'
六、实践
订阅调用工厂
/*** 消息订阅*/
private void messageSubscription(Map<String, Object> map) {asyncEventBus.register(new FxListenerFactory());asyncEventBus.post(map);
}
工厂
/*** @author lyonardo* @Description* @createTime 2022年11月21日 15:24:00*/
@Slf4j
@Service
public class FxListenerFactory {private final FxProductObjListener fxProductObjListener = SpringUtil.getBean(FxProductObjListener.class);private final FxBomObjListener fxBomObjListener = SpringUtil.getBean(FxBomObjListener.class);......@Subscribepublic void send(Map<String, Object> map) {if (MapUtils.isEmpty(map)) {log.error("可售客户没有推送消息");return;}String json = String.valueOf(map.get("json"));log.info("json::"+json);JSONObject jsonObject = JSON.parseObject(json);String eventType = String.valueOf(jsonObject.get("eventType"));String apiName = String.valueOf(jsonObject.get("apiName"));String dataId = String.valueOf(jsonObject.get("dataId"));switch (apiName){case DataObjectApiNameConstants.PRODUCTOBJ : fxProductObjListener.handle(eventType,dataId);break;case DataObjectApiNameConstants.BOMOBJ : fxBomObjListener.handle(eventType,dataId);break;......default: throw new OsRuntimeException(FailCodeEnum.FAIL.getCode(), "没有该订阅对象");}
}
FxProductObjListener
/*** @author lyonardo* @Description 纷享销客商品* @createTime 2022年07月11日 19:59:00*/
@Slf4j
@Service
public class FxProductObjListener extends FxBaseListenerAbstract<BaseTlkSuperEntityDO, FxProductInfoBO>{@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)public void handle(String eventType, String dataId) {...}@Overrideprotected BaseTlkSuperEntityDO getConverter(FxProductInfoBO resource) {...return xx;}
}
1.工厂模式和策略模式的最大区别是,工厂模式提供方法、由工厂根据不同条件创建Bean,而策略模式由调用方创建或注入Bean。
2.简单工厂模式违背了“开闭原则”。因为每加一个实现类,都需要在工厂中添加代码。工厂方法模式可以解决此问题。
相关文章:
设计模式之简单工厂模式
一、概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。 简单工厂模式:又叫做静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品类的实例。 二、适用性 1.当一个类不知道它所必须…...
从SaaS到RPA,没有真正“完美”的解决方案!
众所周知,SaaS行业越来越卷,利润也越来越“薄”,这是传统软件厂商的悲哀,也是未来数字化行业不得不面对的冷峻现状之一。 随着基于aPaaS、低代码的解决方案之流行,SaaS行业变得越来越没有技术门槛,IT人员的…...
miniconda克隆arcpy
arcpy环境克隆 前言尝试思考到此结束 前言 最近遇到了一些问题,需要用到arcpy来处理一些东西,但众所周知,arcgis的arcpy是python 2.0的,我不是很喜欢;所以我安装了arcgis pro 2.8,我发现这也是个坑&#x…...
一万字关于java数据结构堆的讲解,让你从入门到精通
目录 java类和接口总览 队列(Queue) 1. 概念 2. 队列的使用 以下是一些常用的队列操作: 1.入队操作 2.出队操作 3.判断队列是否为空 4.获取队列大小 5.其它 优先级队列(堆) 1. 优先级队列概念 Java中的PriorityQueue具有以下特点 2.常用的PriorityQue…...
Java集合底层源码剖析-ArrayList和LinkedList
文章目录 ArrayList基本原理优缺点核心方法的原理数组扩容以及元素拷贝LinkedList基本原理优缺点双向链表数据结构插入元素的原理获取元素的原理删除元素的原理Vector和Stack栈数据结构的源码剖析ArrayList 基本原理 ArrayList是Java中的一个非常常用的数据结构,它实现了Lis…...
【数据分享】2006-2021年我国城市级别的市政公用设施建设固定资产投资相关指标(30多项指标)
《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况,在之前的文章中,我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国城市级别的市政设施水平相关指标(可查看之前的文章获悉详情ÿ…...
学点Selenium玩点新鲜~,让分布式测试有更多玩法
前 言 我们都知道 Selenium 是一款在 Web 应用测试领域使用的自动化测试工具,而 Selenium Grid 是 Selenium 中的一大组件,通过它能够实现分布式测试,能够帮助团队简单快速在不同的环境中测试他们的 Web 应用。 分布式执行测试其实并不是一…...
【SpringBoot学习笔记】04. Thymeleaf模板引擎
模板引擎 所有的html元素都可以被thymeleaf替换接管 th:元素名 templates下的只能通过Controller来跳转,templates前后端分离,需要模板引擎thymeleaf支持 模板引擎的作用就是我们来写一个页面模板,比如有些值呢,是动态的&#x…...
【uni-app】 .sync修饰符与$emit(update:xxx)实现数据双向绑定
最近在看uni-app文档,看到.sync修饰符的时候,觉得很有必要记录一下 其实uni-app是一个基于Vue.js和微信小程序开发框架的跨平台开发工具 所以经常会听到这样的说法,只要你会vue,uni-app就不难上手 在看文档的过程中,发…...
链表之第二回
欢迎来到我的:世界 该文章收入栏目:链表 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 前言第一题:反转一个链表第二题:链表内指定区间反转第三题:判断一个链表…...
【sgDragSize】自定义拖拽修改DIV尺寸组件,适用于窗体大小调整
核心原理就是在四条边、四个顶点加上透明的div,给不同方向提供按下移动鼠标监听 ,对应计算宽度高度、坐标变化 特性: 支持设置拖拽的最小宽度、最小高度、最大宽度、最大高度可以双击某一条边,最大化对应方向的尺寸;再…...
Gson与FastJson详解
Gson与FastJson详解 Java与JSON 做什么? 将Java中的对象 快速的转换为 JSON格式的字符串. 将JSON格式的字符串, 转换为Java的对象. Gson 将对象转换为JSON字符串 转换JSON字符串的步骤: 引入JAR包 在需要转换JSON字符串的位置编写如下代码即可: String json new Gson().to…...
LeetCode150道面试经典题-- 有效的字母异位词(简单)
1.题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 2.示例 s"adasd" t"daads" 返回true s"addad" t &q…...
前端与人工智能
前端开发与人工智能的结合在未来将会产生许多有趣和有前景的发展。以下是前端与人工智能结合可能带来的一些趋势和前景: 智能用户体验:人工智能可以用于改善用户体验,例如通过个性化推荐、情感分析等技术来提供更贴近用户需求的内容和功能。…...
神经网络基础-神经网络补充概念-14-逻辑回归中损失函数的解释
概念 逻辑回归损失函数是用来衡量逻辑回归模型预测与实际观测之间差异的函数。它的目标是找到一组模型参数,使得预测结果尽可能接近实际观测。 理解 在逻辑回归中,常用的损失函数是对数似然损失(Log-Likelihood Loss)ÿ…...
UG NX二次开发(C++)-PK函数创建一条圆弧曲线
文章目录 1、前言2、创建一个项目3、添加头文件4、在do_it中添加创建圆曲线的源代码5、调用dll6、再创建一个长方体验证1、前言 采用PK进行UG NX二次开发,现在看到的文章很多是直接创建实体,然后在UG NX的视图区显示出来,对于创建圆曲线的文章不多,本文讲一下PK函数创建圆…...
AndroidStudio中修改打包生成的apk名称
1.配置手机架构 splits {abi {enable truereset()include armeabi-v7a,arm64-v8auniversalApk false} } 2.多渠道 productFlavors {normal {applicationId "*****"manifestPlaceholders [appName: "string/app_name_normal"]}driver {applicationId &qu…...
多个springboot整合使用rabbitmq(使用注解的方式)
一、简述 先参考单个springboot使用rabbitmq和了解rabbitmq的五种模式 单个springboot整合rabbitmq_java-zh的博客-CSDN博客 二、创建项目 1、先创建两个springboot项目,一个做生产者,一个做消费者 2、导包(生产者和消费者对应的内容都是一样) <…...
《Effective C++中文版,第三版》读书笔记2
条款06:若不想使用编译器自动生成的函数,就该明确拒绝 为驳回编译器自动()提供的机能,可将相应的成员函数声明为私有的,同时不实现它。 #include <iostream>class MyClass { public:MyClass(int in…...
虫情测报系统的工作原理及功能优势
KH-CQPest虫情测报系统能够在不对虫体造成任何破坏的情况下,无公害的杀死虫子,利用高倍显微镜和高清摄像头拍摄虫体照片,并将虫体照片发送到远端平台,让工作人员无需要到现场,通过平台就可以观察害虫的种类和数量&…...
轻量级日志聚合器Shiplog:中小团队分布式日志管理实践
1. 项目概述:一个为开发者打造的轻量级日志聚合器如果你是一名后端开发者,或者正在维护一个分布式微服务系统,那么对“日志”这个词一定又爱又恨。爱的是,它是排查线上问题的唯一“时光机”;恨的是,当服务实…...
TrendForge 每日精选:10 个热门开源项目,今日总获星 11321 颗!
TrendForge 每日精选热门开源项目发布 TrendForge 致力于追踪全球开源项目动态,每日为开发者精选最具价值的 GitHub 项目。今日共收录 10 个热门项目,项目描述已自动翻译为智能中文翻译版,便于理解。 今日最热项目 Top 10 mattpocock/skills&…...
从零构建趣味AI应用:技术架构、核心实现与部署实战
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫miaoquai,作者是jingchang0623。光看这个名字,可能有点摸不着头脑,但点进去一看,发现这是一个关于“喵趣AI”的开源项目。作为一个在AI应用和开源社区混…...
n8n与Claude集成指南:构建AI代码生成与自动化执行工作流
1. 项目概述与核心价值最近在折腾自动化工作流时,我偶然发现了一个名为n8n-claude-code-guide的开源项目。这个项目乍一看名字,你可能以为它只是一个简单的代码指南,但深入探究后,你会发现它实际上是一个将两个强大的工具——n8n和…...
搞AI的你踩坑了吗?Ubuntu更新后GPU突然‘失联’的排查与修复实录
搞AI的你踩坑了吗?Ubuntu更新后GPU突然‘失联’的排查与修复实录 凌晨三点的实验室,显示器泛着冷光,训练了72小时的模型即将收敛。你按下回车键查看进度,却看到一行刺眼的报错:NVIDIA-SMI has failed because it could…...
形式化验证实战指南:从数学证明到芯片验证工程实践
1. 从一封邀请函说起:为什么我们还在谈论形式化验证?前几天整理旧资料,翻出了一封2011年的邮件,标题是“Youre invited to Jaspers annual user group meeting”。发件人是EE Times的编辑Clive Maxfield,内容是关于Jas…...
Zotero Duplicates Merger终极指南:3步告别文献重复困扰
Zotero Duplicates Merger终极指南:3步告别文献重复困扰 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 还在为Zotero文献库中堆积…...
AI Agent配置文件供应链安全:AgentLint静态分析工具实战指南
1. 项目概述与核心价值最近在折腾AI编程助手,比如Claude Code和Cursor,发现它们的配置文件(.claude/、CLAUDE.md、.cursorrules)功能强大得有点吓人。这些文件不仅能定义代码风格,还能配置“技能”(Skills&…...
OpenClaw-Zulip桥接器:实现AI Agent与团队协作工具的无缝集成
1. 项目概述:一个为AI Agent打造的Zulip消息桥梁如果你正在构建一个基于OpenClaw的AI Agent系统,并且你的团队恰好使用Zulip作为内部沟通工具,那么你很可能面临一个痛点:如何让Agent无缝地融入团队的日常对话流?是让团…...
VSCode毛玻璃效果实现:CSS backdrop-filter原理与性能调优指南
1. 项目概述:当代码编辑器遇上毛玻璃美学如果你和我一样,每天有超过8小时的时间是在Visual Studio Code(以下简称VSCode)中度过的,那么你肯定不止一次地折腾过它的主题和外观。从默认的深色主题到各种炫酷的Material D…...
