设计模式-工厂方法(创建型)
创建型-工厂方法
简单工厂
- 将被创建的对象称为“产品”,将生产“产品”对象称为“工厂”;
- 如果创建的产品不多,且不需要生产新的产品,那么只需要一个工厂就可以,这种模式叫做“简单工厂”,它不属于23中设计模式之一;
- 简单工厂这种模式不符合对拓展开放,对修改关闭的开闭原则,因为这种设计模式,新增产品的时候需要修改工厂类代码;
例
简单工厂:
/** 简单工厂,工厂类*/
public class SimpleFactory {private static SimpleFactory INSTANCE = new SimpleFactory();public static SimpleFactory getInstance(){return INSTANCE;}public Car createCar() {return new Car();}public Plane createPlane() {return new Plane();}public Train creatTrain(){return new Train();}
}
简单工厂使用:
public class main {public static void main(String[] args) {SimpleFactory simpleFactory = SimpleFactory.getInstance();Car car = simpleFactory.createCar();Plane plane = simpleFactory.createPlane();Train train = simpleFactory.creatTrain();}
}
这种模式如果产生一个other交通工具,还需要在工厂类中新增creatOther()方法。
工厂方法
角色
- 抽象工厂:提供创建产品的接口,调用者通过它访问具体的工厂的工厂方法;
- 具体工厂:实现抽象工厂中的抽象方法,完成具体的创建;
- 抽象产品:定义产品的规范,描述产品的主要特性;
- 具体产品:实现抽象产品角色定义的接口,它与具体工厂一一对应;
图解

实现案例
产品抽象类:
public interface Vehicle {void go();
}
产品具体实现类:
public class Car implements Vehicle{@Overridepublic void go() {System.out.println("汽车在跑!");}
}public class Plane implements Vehicle{@Overridepublic void go() {System.out.println("火车在跑!");}
}public class Train implements Vehicle{@Overridepublic void go() {System.out.println("飞机在飞!");}
}
抽象工厂类:
public interface VehicleFactory {Vehicle create();
}
具体工厂类:
public class CarFactory implements VehicleFactory{private static CarFactory INSTANCE = new CarFactory();@Overridepublic Vehicle create() {return new Car();}public static CarFactory getInstance(){return INSTANCE;}
}public class PlaneFactory implements VehicleFactory{private static PlaneFactory INSTANCE = new PlaneFactory();@Overridepublic Vehicle create() {return new Plane();}public static PlaneFactory getInstance(){return INSTANCE;}
}
public class TrainFactory implements VehicleFactory{private static TrainFactory INSTANCE = new TrainFactory();@Overridepublic Vehicle create() {return new Train();}public static TrainFactory getInstance(){return INSTANCE;}
}
使用:
public class main {public static void main(String[] args) {CarFactory carFactory = CarFactory.getInstance();Vehicle vehicle = carFactory.create();vehicle.go();}
}
总结
- 简单工厂不符合开闭原则。
- 工厂方法,每次增加一个产品时,都需要增加一个具体类和对应的工厂,使系统中类的数量成倍增加,增加了系统的复杂度和具体类的依赖;
相关文章:
设计模式-工厂方法(创建型)
创建型-工厂方法 简单工厂 将被创建的对象称为“产品”,将生产“产品”对象称为“工厂”;如果创建的产品不多,且不需要生产新的产品,那么只需要一个工厂就可以,这种模式叫做“简单工厂”,它不属于23中设计…...
分布式事务大揭秘:使用MQ实现最终一致性
本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是小米,一个热爱分享技术的29岁程序员,今天我们来聊聊分布式事务中的一种经典实现方式——MQ最终一致性。这是一个在互联网公司中广…...
【IoT NTN】3GPP R18中关于各类IoT设备在NTN中的增强和扩展
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。 博客内容主要围绕…...
vs - vs2015编译gtest-v1.12.1
文章目录 vs - vs2015编译gtest-v1.12.1概述点评笔记将工程迁出到本地后,如果已经编译过工程,将工程Revert, Clean up 干净。编译用的CMake, 优先用VS2019自带的打开VS2015X64本地命令行编译gtest工程测试安装自己写个测试工程,看看编译出来的…...
你好GPT-4o——对GPT-4o发布的思考与看法
你好GPT-4o 前言 2024年5月13日,OpenAI官网发布了他们的新一代自然语言处理交互系统——GPT-4o。这是OpenAI继GPT4之后又一个新的旗舰模型。 GPT-4o(“o”代表“omni”)是迈向更自然的人机交互的一步——它接受文本、音频、图像和视频的任意…...
QT 信号和槽 多对一关联示例,多个信号,一个槽函数响应,多个信号源如何绑定一个槽函数
三个顾客 Anderson、Bruce、Castiel 都要订饭,分别对应三个按钮,点击一个按钮,就会弹出给该顾客送饭的消息。注意这个例子只使用一个槽函数,而三个顾客名称是不一样的,弹窗时显示的消息不一样,这需要一些 技…...
宝塔nginx配置
将跟php有关的注释掉: 添加: #解决vue刷新404问题try_files $uri $uri/ /index.html; location /prod-api/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header…...
容器化实践:DevOps环境下的容器交付流程
DevOps的兴起是为了应对市场和消费者对技术应用的不断增长的需求。它的目标是构建一个更快的开发环境,同时保持软件的高质量标准。DevOps还致力于在敏捷开发周期中提升软件的整体品质。这一目标的实现依赖于多种技术、平台和工具的综合运用。 结合容器化技术与DevO…...
Linux---sudo命令
文章目录 目录 文章目录 一.sudo命令简介 二.sudo 命令的特点 三.sudo 相关文件 四.sudo 命令授权配置 一.sudo命令简介 sudo 命令全称“SuperUser Do”,是Linux系统中的一个命令能够使普通用户以超级用户身份去执行某些命令。 二.sudo 命令的特点 sudo能够授权…...
前后端分离与实现 ajax 异步请求 和动态网页局部生成
前端 <!DOCTYPE html><!-- 来源 --> <!-- https://cloud.tencent.com/developer/article/1705089 --> <!-- https://geek-docs.com/ajax/ajax-questions/19_ajax_javascript_send_json_object_with_ajax.html --> <!-- 配合java后端可以监听 --&…...
Windows系统下CUDA、cuDNN与PyTorch的更新与安装全攻略
Windows系统下CUDA、cuDNN与PyTorch的更新与安装全攻略 文章目录 Windows系统下CUDA、cuDNN与PyTorch的更新与安装全攻略一、引言二、CUDA、cuDNN与PyTorch-GPU介绍三、安装准备1. 查看支持的CUDA版本2. 查看已安装的CUDA版本3. 查看支持的PyTorch版本 四、卸载旧版CUDA五、下载…...
Android Dialog使用汇总
Dialog分类 AlertDialog Dialog 类是对话框的基类,官方建议我们不要直接实例化它,而是使用其子类来获取实例。AlertDialog是系统提供的一个直接子类,它能帮助我们快速构建出不同类型的弹窗。接下来就看下各种类型弹窗的使用。 1、普通对话框…...
[数据集][目标检测]足球场足球运动员身份识别足球裁判员数据集VOC+YOLO格式312张4类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):312 标注数量(xml文件个数):312 标注数量(txt文件个数):312 标注类别…...
学习分享-声明式的 HTTP 客户端OpenFeign
OpenFeign 详细介绍 最近在学习中有用到OpenFeign,也在网上查找了相关资料,做下分享。 一、概述 OpenFeign 是一个声明式的 HTTP 客户端,它使得调用 REST API 变得更加简单和直观。通过 OpenFeign,开发者只需定义接口并添加注解…...
python Tk 获取输入框内容,分割内容
创建输入框、一个按钮和一个标签的GUI。 用户可以在输入框中输入文本,点击按钮后,程序将在控制台打印输入的文本(已经分割为列表),并在GUI中的标签上显示一些静态文本。 import tkinter as tk# 创建主窗口 root tk.…...
第十二章:净世山的终极考验
虽然击败了黑袍人,但四人并未有丝毫的松懈。他们深知,净世山的考验远不止如此。果然,随着黑袍人的倒下,整个山顶开始剧烈震动,仿佛有什么东西即将苏醒。“小心,这山顶似乎有变!”赵无极大声提醒…...
linux常用命令及其选项
1、常用命令 1.1、ls 选项说明-a显示所有文件及目录 (包括隐藏文件)-i显示inode-A同 -a选项 ,但不列出 "." (目前目录) 及 ".." (父目录)-l列出信息详细(如文件型态、权限、拥有者、文件大小等)-R递归显示(若目录下有文件,则以下之…...
虚拟存储器概述
目录 常规存储器管理方式的特征和局部性原理 缺点 局部性原理 局部性原理的应用 1. 提高内存利用率 2. 实现按需装入 3. 支持内存共享 4. 提高系统稳定性 虚拟存储器的定义与特征 虚拟存储器的特征 虚拟存储器的实现机制 虚拟存储器的工作过程 虚拟存储器的优点 虚…...
C++对象池设计与实现
目录 一、对象池简介 1.1 池化技术 1.2 什么是对象池 1.3 对象池分配策略 二、C new和delete运算符重载 三、实现一个对象池框架 3.1 策略接口 四、实现几种对象池的分配策略 4.1 数组策略 4.2 堆策略 编辑 4.3 栈策略 4.4 区块策略 一、对象池简介 1.1 池化技…...
电商系统中热库和冷库的使用与数据转换
在现代电子商务系统中,数据的高效管理和存储是关键。电商平台每日处理海量数据,这些数据不仅包括用户行为、交易记录,还涵盖库存信息、商品详情、物流信息等。为了优化数据存储和查询效率,电商系统通常采用热库(Hot St…...
京东AI优势持续升级,京东的AI大棋局怎么看?
日前,京东媒体沟通会召开,会上,京东展示了其在大模型、数字人、AI硬件及企业级解决方案上的最新布局。这次畅谈让我们看到了更多的京东大棋局,京东的AI战略并非单纯的技术军备竞赛,而是一场围绕“降本增效”与“生态重…...
通义千问3-VL-Reranker-8B在电商搜索中的惊艳效果展示
通义千问3-VL-Reranker-8B在电商搜索中的惊艳效果展示 1. 多模态重排序如何改变电商搜索体验 电商平台的搜索功能正面临前所未有的挑战。当用户输入"白色连衣裙 夏季 透气"时,传统搜索引擎只能基于文本匹配返回结果,无法理解"透气"…...
图解Uboot FIT Image:its文件里的load、entry地址到底怎么填?(以i.MX8MP为例)
深入解析Uboot FIT Image:i.MX8MP平台its文件地址配置实战指南 当你在i.MX8MP平台上第一次看到FIT Image的its文件时,那些神秘的load和entry地址值是否让你感到困惑?这些看似随意的十六进制数字背后,其实隐藏着嵌入式系统启动过程…...
云边端一体化核心技术:数据同步与边缘智能实现
云边端一体化核心技术:数据同步与边缘智能实现📚 本章学习目标:深入理解数据同步与边缘智能实现的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《云原生、云边端一体化与算力基建&#…...
别再只盯着R和C了!芯片设计中的互连寄生参数,这3个实战场景下的模型选择与避坑指南
芯片设计实战:互连寄生参数模型选择的3个关键场景与避坑策略 在28nm及以下工艺节点的芯片设计中,互连寄生参数对时序收敛的影响已超过晶体管本身特性。当设计团队从RTL综合进入物理实现阶段,工程师们常常陷入这样的困境:明明STA报…...
从官方Demo到项目集成:海康MV-EB435i RGBD相机C++采集与OpenCV图像处理实战
1. 环境准备与SDK安装 第一次接触海康MV-EB435i这款RGBD相机时,我花了两天时间才把开发环境搭好。现在回想起来,其实只要抓住几个关键点就能少走弯路。先说说硬件准备:这款相机支持USB3.0和千兆网口两种连接方式,实测USB连接更稳定…...
程序员面试别再死磕算法了!面试官真正想看的是这几点
文章目录开篇:刷题300道,面试5分钟挂,你中招了吗?算法是门票,但门票不能当饭吃面试官真正在偷看的五个隐藏考点1. 代码的"卫生习惯"比你想象的更重要2. 系统设计:别只会砌砖,要会盖楼…...
AMD ROCm深度学习实战:从零构建高性能AI推理架构
AMD ROCm深度学习实战:从零构建高性能AI推理架构 【免费下载链接】ROCm AMD ROCm™ Software - GitHub Home 项目地址: https://gitcode.com/GitHub_Trending/ro/ROCm 面对AI推理场景中模型部署复杂、性能瓶颈突出和硬件兼容性挑战,AMD ROCm开源软…...
别再手动抄表了!用Python+Snap7实时采集S7-1200数据到Excel(附完整代码)
工业自动化数据采集实战:PythonSnap7实现S7-1200实时数据归档系统 在智能制造和工业4.0的浪潮中,生产设备的实时数据采集已成为工厂数字化升级的基础环节。传统的手动抄表方式不仅效率低下,还容易引入人为误差。本文将展示如何构建一个基于P…...
AI 辅助开发实战:基于开源模型的人脸识别毕设系统设计与避坑指南
最近在帮学弟学妹们看人脸识别相关的毕业设计,发现大家普遍卡在几个地方:要么模型跑不起来,要么准确率上不去,部署到服务器上更是问题百出。正好结合我自己的经验和现在流行的 AI 辅助开发工具,梳理了一套从零到一的实…...
