介绍工厂模式
简单工程
public class SingleFactoryTest {public static void main(String[] args) {SingleFactory factory = new SingleFactory();Product productA = factory.getObject("1");productA.method();Product productB = factory.getObject("2");productB.method();}
}class SingleFactory {public SingleFactory(){};Product createProduct(String type) {switch (type) {case "1":return new ProductA();case "2":return new ProductB();default:return null;}} Product getObject(String type) {Product product = createProduct(type);return product;}
}
工厂方法
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使的一个类的实例化延迟到了子类
场景
- 当你不知道改使用对象的确切类型的时候
- 当你希望为库或框架提供扩展其内部组件的方式时
优点
- 将具体产品和创建者解耦
- 符合单一职责原则
- 符合开闭原则
public class FactoryMethodTest {public static void main(String[] args) {ProductFactory factoryA = new ProductAService();Product productA = factoryA.getObject();productA.method();ProductFactory factoryB = new ProductBService();Product productB = factoryB.getObject();productB.method();}
}interface Product{void method();
}
abstract class ProductFactory{abstract Product createProduct();Product getObject(){Product product = createProduct();return product;}
}class ProductA implements Product{@Overridepublic void method() {System.out.println("ProductA method.");}
}
class ProductB implements Product{@Overridepublic void method() {System.out.println("ProductB method.");}
}
class ProductAService extends ProductFactory{@OverrideProduct createProduct() {return new ProductA();}
}
class ProductBService extends ProductFactory{@OverrideProduct createProduct() {return new ProductB();}
}
抽象工厂
提供一个创建一系列相关或互相依赖对象的接口,无需指定他们具体的类
场景
程序需要处理不同系列的相关产品,但是不希望它依赖于这些产品的具体类,可以使用抽象工厂。抽象工厂也就是一系列的工厂方法组成。
优点
- 可以确定是从工厂得到的产品彼此是兼容的
- 可以避免具体产品和客户端代码之间的紧密耦合
- 符合单一职责原则
- 符合开闭原则
public class AbstractFactoryTest {public static void main(String[] args) {IDatabaseUtils mysqlDatabaseUtils = new MysqlDatabaseUtils();mysqlDatabaseUtils.getConnection().connect();mysqlDatabaseUtils.getCommand().command();IDatabaseUtils oracleDatabaseUtils = new OracleDatabaseUtils();oracleDatabaseUtils.getConnection().connect();oracleDatabaseUtils.getCommand().command();}
}
// 接口
interface IConnection{void connect();
}
interface ICommand{void command();
}
interface IDatabaseUtils{IConnection getConnection();ICommand getCommand();
}
// MySQL实现类
class MysqlConnection implements IConnection{@Overridepublic void connect() {System.out.println("mysql connected.");}
}
class MysqlCommand implements ICommand{@Overridepublic void command() {System.out.println("mysql command.");}
}
class MysqlDatabaseUtils implements IDatabaseUtils{@Overridepublic IConnection getConnection() {return new MysqlConnection();}@Overridepublic ICommand getCommand() {return new MysqlCommand();}
}
// Oracle实现类
class OracleConnection implements IConnection{@Overridepublic void connect() {System.out.println("oracle connected.");}
}
class OracleCommand implements ICommand{@Overridepublic void command() {System.out.println("oracle command.");}
}
class OracleDatabaseUtils implements IDatabaseUtils{@Overridepublic IConnection getConnection() {return new OracleConnection();}@Overridepublic ICommand getCommand() {return new OracleCommand();}
}相关文章:
介绍工厂模式
简单工程 public class SingleFactoryTest {public static void main(String[] args) {SingleFactory factory new SingleFactory();Product productA factory.getObject("1");productA.method();Product productB factory.getObject("2");productB.me…...
大数据领域的workload是什么意思?
什么是workload? 在大数据领域,"workload"指的是需要处理的数据集和对其执行的操作的组合。它描述了大数据系统需要执行的任务的类型和规模。 我们可以从以下几个维度来理解大数据领域的 workload: 数据的特征: 数据量 需要处…...
引入别人的安卓项目报错
buildscript { repositories { google() jcenter() } dependencies { classpath com.android.tools.build:gradle:4.1.0 // 使用最新版本的插件 } } allprojects { repositories { google() jcenter() } } 在…...
Python Excel 指定内容修改
需求描述 在处理Excel 自动化时,财务部门经常有一个繁琐的场景,需要读取分发的Excel文件内容复制到汇总Excel文件对应的单元格内,如下图所示: 这种需求可以延申为,财务同事制作一个模板,将模板发送给各员工,财务同事需收取邮件将员工填写的excel文件下载到本机,再类似…...
【力扣高频题】003.无重复字符的最长子串
前段时间和小米的某面试官聊天。因为我一直在做 算法文章 的更新,就多聊了几句算法方面的知识。 并且在聊天过程中获得了一个“重要情报”:只要他来面试,基本上每次的算法题,都会去考察关于 子串和子序列 的问题。 的确…...
redis03 补充 事件
1.文件事件...
绿联Nas docker 中 redis 老访问失败的排查
部署了一些服务,老隔3-5 天其他服务就联不上 redis 了,未确定具体原因,只记录观察到的现象 宿主机访问 只有 ipv6 绑定了,ipv4 绑定挂掉了 其他容器访问 也无法访问成功 当重启容器后: 一切又恢复正常。 可能的解…...
Linux入门学习(2)
1.相关复习新的指令学习 (1)我们需要自己创建一个用户,这个用户前期可以是一个root用户,后期使用创建的普通用户 (2)文件等于文件内容加上文件属性,对于文件的操作就包括对于文件内容的操作和文件属性&…...
Spring boot开启跨域配置
Spring boot开启跨域配置 背景 跨域(Cross-Origin)是指在互联网上的一个域下的文档或脚本尝试请求另一个域下的资源时,域名、协议或端口不同的这种情况。具体来说,如果一个网页试图通过脚本(如JavaScript)…...
java面试题:hashCode的作用
在Java集合中,hashCode起着至关重要的作用,特别是在基于哈希的集合类如HashMap、HashSet和Hashtable中。以下是hashCode在集合中的主要作用: 快速查找和定位: hashCode被用作确定对象在哈希表中存储位置的索引(或称为“…...
从零开始精通Onvif之获取设备信息
💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。 与设备交互的第一步 发现设备之后,与设备进行交互的第一步,是连接上设备,并获取设备的信息。连接设备&#…...
FiRa标准UWB MAC实现(三)——距离如何获得?
继续前期FiRa MAC相关介绍,将FiRa UWB MAC层相关细节进一步进行剖析,介绍了UWB技术中最重要的一个点,高精度的距离是怎么获得的,具体使用的测距方法都有哪些,原理又是什么。为后续FiRa UWB MAC的实现进行铺垫。 3、测距方法 3.1 SS-TWR SS-TWR为Single-Sided Two-Way Ra…...
基于百度翻译API的火车头PHP翻译插件,可以翻译HTML片段
关于火车头的百度翻译插件,相信大家在火车头官网或网上都能找到相关代码,百度翻译插件是PHP写的,就一个PHP文件,简单灵活,不受火车头软件版本限制,任何有PHP插件权限的火车头版本都可以使用。但是百度API翻…...
mysql高级用法常用函数
mysql高级用法 1、自定义排序 select * from movies order by field(actors, 成龙, 靳东, 刘亦菲, 范冰冰); // 字段中存在null值 select * from movies order by field (coalesce(actors,null),成龙, 靳东, 刘亦菲, 范冰冰,null)2、空值NULL排序(ORDER BY IF(ISN…...
【打印100个常用Linux命令】
#!/bin/bash 定义一个函数,用于打印100个常用Linux命令 print_commands() { echo “以下是一些常用的Linux命令:” echo “----------------------------------” echo “1. pwd - 显示当前工作目录” echo “2. ls - 列出当前目录下的文件和文件夹” …...
友情提示:lazarus的tsortgrid.autofillcolumns存在BUG
直接在tsortgrid的属性中设置autofillcolumns为true,会提示:123个错误。即使修改为false,编译运行照样会出现上述错误。唯一解决的办法就是删除sortgrid重新添加一个。 代码设置SortGrid1.AutoFillColumns : TRUE不受影响。...
github的个人readme文件
一个好的svg图: Simon-He95/profile-3d-contrib/profile-season-animate.svg at 4281d9f46e3d5416bd8f8cc5779157bfdaa8589d Simon-He95/Simon-He95 GitHub 请访问他的主页从提交记录就可以看到这个立体的登录github的图...
java面试题: HashMap、HashSet 和 HashTable 的区别
HashMap 常用方法 HashMap 是一个基于哈希表的 Map 接口的实现。它允许使用 null 值和 null 键。 java 复制 // 创建一个HashMap HashMap<KeyType, ValueType> map new HashMap<>(); // 添加元素 map.put(key, value); // 获取元素 ValueType value map.get…...
CPP初级:模板的运用!
目录 一.泛型编程 二.函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 三.函数模板的实例化 1.隐式实例化 2.显式实例化 3.模板参数的匹配原则 四.类模板 1.类模板的定义格式 2.类模板的实例化 一.泛型编程 泛型编程:编写与类型无关的通用代码…...
排序---基数排序
前言 个人小记 一、简介 基数排序是一种非比较排序,所以排序速度较快,当为32位int整数排序时,可以将数分为个位十位分别为2^16,使得拷贝只需要两轮,从而达到2*n,然后给一个偏移量,使得可以对负数排序。以…...
能做表格的 AI 软件:Excel-Agent,AI 原生重构表格数据分析全流程
当传统 Excel 被卡顿、复杂公式、海量数据难处理、手动重复操作困住时,能做表格的 AI 软件正成为效率破局关键 —— 而 Excel-Agent,正是专为 Excel 场景打造的 AI 数据智能体,以自然语言交互、本地高效计算、全链路数据处理能力,…...
python基于flask的学生学业质量成绩分析系统演可视化大屏 大数据
目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析可视化大屏设计大数据处理架构预警与决策支持技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 数据采…...
嵌入式状态机设计与实现全解析
1. 嵌入式状态机基础概念状态机(State Machine)是嵌入式系统开发中最核心的设计模式之一,它通过定义系统可能处于的状态集合、状态之间的转换条件以及状态转换时执行的动作,为复杂系统行为建模提供了清晰框架。在嵌入式环境中&…...
BM42S3021-1热电偶模块嵌入式驱动与I²C集成实战
1. BM42S3021-1热电偶模块底层技术解析与嵌入式集成实践1.1 模块硬件架构与通信协议本质BM42S3021-1是Best Modules公司推出的高精度热电偶信号调理模块,其核心并非简单的IC从设备,而是一个集成了冷端补偿(Cold Junction Compensation, CJC&a…...
前端新手入门:借助快马仿写腾讯qclaw官网掌握基础布局
作为一个刚接触前端开发的新手,我最近尝试通过模仿企业官网来学习HTML和CSS。腾讯qclaw官网结构清晰、设计规范,非常适合作为入门练习的样板。在这个过程中,我发现InsCode(快马)平台的实时预览功能特别有帮助,让我能即时看到代码修…...
百川2-13B模型API调用详解:从Python安装到第一个成功请求
百川2-13B模型API调用详解:从Python安装到第一个成功请求 你是不是也对大模型API调用感到好奇,但一看到那些技术文档就头疼?别担心,今天咱们就来手把手走一遍,从零开始,用最简单的Python代码,完…...
writeup
3-hafuhafu - Writeup by AI 题目信息 项目内容平台BugKu类型Crypto (RSA)考点RSA 加密、大数分解、私钥计算 题目描述 题目给出了一个 RSA 公钥和一段 Base64 编码的密文,要求解密得到 flag。 公钥信息: pk (25572000680139535995611501720832880…...
FPGA新手必看:Vivado 2023.1里用DDS IP核生成1MHz正弦波,附完整仿真代码
FPGA实战:从零构建1MHz正弦波生成器的Vivado全流程解析 刚拿到FPGA开发板时,我最想实现的第一个项目就是信号发生器。看着示波器上跳动的波形从自己编写的代码中产生,这种成就感无可替代。本文将带你用Xilinx Vivado 2023.1中的DDS IP核&…...
小模型大能力:DeepSeek-R1-Distill-Qwen-1.5B在边缘计算中的应用
小模型大能力:DeepSeek-R1-Distill-Qwen-1.5B在边缘计算中的应用 1. 引言:边缘计算时代的轻量级AI解决方案 在AI技术快速发展的今天,大模型已经展现出惊人的能力。然而,当我们把目光投向边缘计算场景时,传统的百亿参…...
Android Studio 高版本兼容低版本项目配置
AndroidStudio开发工具高版本兼容低版本项目配置:1、 JDK 配置:gradle.properties 文件中指定jdk 版本:org.gradle.java.homeD\:\\ProgramFiles\\JDK\\jdk-11.0.262 配置Gradle 编译版本:3. 显示所有Gradle task 列表设置完成后&a…...
