深入理解设计模式面经
1 讲讲工厂方法模式,
1.1 给我一个java的demo
工厂方法模式是一种创建型设计模式,它提供了一个接口用于创建对象,但允许子类修改将要创建的对象类型。这种模式抽象了对象的创建过程,使得代码可以在不知道创建的对象具体类的情况下工作。
基本结构:
- Product(产品): 这是创建的对象的接口。
- ConcreteProduct(具体产品): 这是实现Product接口的具体类。
- Creator(创建者): 这是一个抽象类,它定义了一个抽象的工厂方法。这个方法返回一个Product类型的对象。
- ConcreteCreator(具体创建者): 这是继承自Creator的类,它实现了工厂方法来生产具体的产品。
示例:
假设我们要设计一个UI库,其中有多种按钮类型。我们可以使用工厂方法模式来设计这个库。
// Product
interface Button {void render();
}// ConcreteProductA
class WindowsButton implements Button {@Overridepublic void render() {System.out.println("Rendering a Windows-style button.");}
}// ConcreteProductB
class MacButton implements Button {@Overridepublic void render() {System.out.println("Rendering a Mac-style button.");}
}// Creator
abstract class Dialog {// This is the factory methodprotected abstract Button createButton();public void render() {// use the factory method to create a product objectButton button = createButton();button.render();}
}// ConcreteCreatorA
class WindowsDialog extends Dialog {@Overrideprotected Button createButton() {return new WindowsButton();}
}// ConcreteCreatorB
class MacDialog extends Dialog {@Overrideprotected Button createButton() {return new MacButton();}
}public class FactoryMethodDemo {public static void main(String[] args) {Dialog windowsDialog = new WindowsDialog();windowsDialog.render();Dialog macDialog = new MacDialog();macDialog.render();}
}
在上面的示例中,Dialog
是一个创建者,它有一个工厂方法createButton()
。具体的对话框(如WindowsDialog
和MacDialog
)实现了这个工厂方法来创建具体的按钮。
1.2 相比于简单工厂模式,这种工厂方法模式有什么好处呢
工厂方法模式和简单工厂模式都是用于创建对象的,但它们在结构和意图上有所不同。下面是工厂方法模式相比于简单工厂模式的一些优势:
-
更好的可扩展性:
- 简单工厂:当需要添加新的产品时,你可能需要修改已有的工厂类,这违反了开闭原则(对扩展开放,对修改封闭)。
- 工厂方法:只需添加新的具体创建者(ConcreteCreator)和具体产品(ConcreteProduct),无需修改已有的代码。这使得系统更加模块化和可扩展。
-
单一职责原则:
- 在工厂方法模式中,每个具体创建者(ConcreteCreator)都只负责生产一种具体产品(ConcreteProduct)。这符合单一职责原则。
- 而在简单工厂模式中,一个工厂类可能需要处理多种产品的创建,这可能导致工厂类的代码过于复杂和臃肿。
-
更好地与子类合作:
- 工厂方法模式允许子类提供其自己版本的对象实例化逻辑,这增加了系统的灵活性。
- 简单工厂模式中,创建对象的逻辑被固定在工厂类中,难以做出细粒度的定制。
-
更好的封装:
- 在工厂方法模式中,每种产品的创建逻辑都被封装在相应的具体创建者中。这使得创建逻辑和产品本身更紧密地结合。
- 而在简单工厂模式中,所有的创建逻辑都集中在一个工厂类中,这可能导致工厂类过于庞大。
-
动态指定工厂:
- 在工厂方法模式中,你可以动态地更改或指定使用哪个工厂来创建对象,提供了更大的灵活性。
- 在简单工厂模式中,通常基于一个参数或条件来决定创建哪种对象,这限制了其动态性。
尽管工厂方法模式提供了这些优点,但它也带来了更多的类和更复杂的结构。对于某些简单的情况,简单工厂模式可能更为合适。设计模式的选择应该基于项目的具体需求和上下文。
2
相关文章:
深入理解设计模式面经
1 讲讲工厂方法模式, 1.1 给我一个java的demo 工厂方法模式是一种创建型设计模式,它提供了一个接口用于创建对象,但允许子类修改将要创建的对象类型。这种模式抽象了对象的创建过程,使得代码可以在不知道创建的对象具体类的情况…...

STM32单片机蓝牙APP宠物自动喂食器定时语音提醒喂食系统设计
实践制作DIY- GC00162---蓝牙APP宠物自动喂食器 一、功能说明: 基于STM32单片机设计---蓝牙APP宠物自动喂食器 二、功能说明: STM32F103C系列最小系统板LCD1602显示器DS1302时钟模块5个按键语音播报模块ULN2003步进电机模块LED灯板HC-05蓝牙模块&#x…...

武汉凯迪正大—串联谐振在电力系统中应用的优点:
变频串联谐振耐压试验装置在电力系统中应用的优点 1、所需电源容量大大减小。串联谐振电源是利用谐振电抗器和被试品电容谐振产生高电压和大电流的,在整个系统中,电源只需要提供系统中有功消耗的部分,因此,试验所需的电源功率只有…...
Git仓库、分支的区别
https://blog.csdn.net/weixin_30315905/article/details/94954617 git 仓库、分支的区别 首先,要明白仓库的概念 仓库可以理解为repository, 就是存放代码的地方,—— 其实是一个比较笼统的概念,不管里面的内容,总之…...
C#生成随机验证码
以下是一个简单的C#验证码示例: private void GenerateCaptcha() {// 生成随机字符串string chars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";Random random new Random();string captchaString new string(Enumerable.Repe…...
如何使用C++来找出编码88表示的字符?指出至少两种方法。
在C中,可以使用整型值来表示字符编码,其中ASCII码是最常见的字符编码方案。要找出编码为88的字符,可以使用以下两种方法: 方法一:使用类型转换(显式类型转换或隐式类型转换)将整型值转换为字符…...

Kafka:springboot集成kafka收发消息
kafka环境搭建参考Kafka:安装和配置_moreCalm的博客-CSDN博客 1、springboot中引入kafka依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><…...
本质矩阵E、基本矩阵F、单应矩阵H
1. E (归一化坐标对进行计算) t ^ R 为3*3的矩阵, 因为R,t共有6个自由度,又因为单目尺度等价性,所以实际上E矩阵共有5个自由度。因此至少需要5个点对来求解。 2. 基本矩阵F:根据两帧间匹配的像素点对儿计算 3*3且自由度为7的矩阵kF也为基础矩阵&#x…...

Oracle database Linux自建环境备份至远端服务器自定义保留天数
环境准备 linux下安装oracle 请看 oracle12c单节点部署 系统版本: CentOS 7 软件版本: Oracle12c 备份策略与实现方法 此次备份依赖Oracle自带命令exp与linux下crontab命令(定时任务) exp Oracle中exp命令是一个用于导出数据库数据和对象的…...
SpringBoot异步任务(2)|(线程池使用)
SpringBoot异步任务(2)|(线程池使用) 文章目录 SpringBoot异步任务(2)|(线程池使用)[TOC] 前言一、使用场景二、springboot添加异步任务1.配置线程池2.线程池的使用 总结 章节 第一章…...

解决Windows:Call to undefined function exif_imagetype()
很明显,是php安装时没有打开某些扩展,以致不能执行exif_imagetype()这个方法,因此需要打开。 网上很多人说需要打开下面这两个扩展: extension=php_exif.dll extension=php_mbstring.dll 但只说对了一半,我一开始也按照网上文章说的打开这两个扩展,但是还是同样错误。…...

【Spring】Spring AOP 初识及实现原理解析
博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE进阶 目录 文章目录 一、初识AOP 1.1 什么是AOP? 1.2 AOP的组成 1.2.1 切面(Aspect) 1.2.2 切点(Pointcut) 1.2.3 连接点&…...
【Express.js】集成Redis
集成Redis 本节我们介绍在 express.js 中集成 redis. Redis是一个高性能的key-value内存数据库,支持事务、队列、持久化等特性,常用于高并发性能场景。 准备工作 创建一个 express.js 项目(本文基于evp-express-cli)在开发环境…...
StringBuilder创建的对象如何清空
要清空一个StringBuilder对象,可以使用其实例方法setLength(int newLength)来实现。将newLength参数设置为0,就可以将StringBuilder的内容清空。以下是一个示例代码: StringBuilder sb new StringBuilder(); // 添加一些内容到StringBuilde…...
mybatis-plus实现mysql自定义IKeyGenerator
1. IKeyGenerator主键生成 内置实现类,缺少mysql,因为mysql不支持序列,只能通过表模拟序列 H2KeyGenerator PostgreKeyGenerator KingbaseKeyGenerator 人大金仓的KES数据库 DB2KeyGenerator OracleKeyGenerator2. 新建表模拟序列 CREATE T…...

山西电力市场日前价格预测【2023-08-11】
日前价格预测 预测明日(2023-08-11)山西电力市场全天平均日前电价为367.15元/MWh。其中,最高日前电价为408.91元/MWh,预计出现在20: 00。最低日前电价为343.90元/MWh,预计出现在02: 30。 价差方向预测 1: 实…...

浏览器无法连接网络问题
问题描述 电脑其他程序都能正常联网,但是所有的浏览器都无法联网,同时外部网站都能ping通 问题诊断 查看电脑Internet连接的问题报告显示:该设备或资源(Web 代理)未设置为接受端口"7890"上的连接。 解决方案 经过检查发现不是IP地址…...

ZyjDataLink 全量MySQL同步程序 - 开发过程 01
开发过程由本人从 架构设计 到 代码实现 独立完成,通过该博客记录分享开发经验 ZyjDataLink 当前的目标是做到 MySQL大数据量的快速同步,后期希望扩展的功能 高度可操作性,融入增量数据库同步,跨数据库同步 ZyjDataLink 需求分析…...
为什么说Python股票接口是连接投资与编程的桥梁?
在现代金融领域,投资与技术的结合日益紧密,而Python作为一种强大的编程语言,为投资者提供了开发股票交易策略和分析市场数据的高效工具。 一、Python股票接口的重要性: Python作为一种易学易用的编程语言,逐渐成为金融…...
kubectl,helm安装到window
1、Windows创建目录和文件 创建文件到指定目录记得切换目录 安装到家目录 wangdachuD-M70K45QX-1544 MINGW64 ~ $ mkdir -p .kubewangdachuD-M70K45QX-1544 MINGW64 ~ $ vi configwangdachuD-M70K45QX-1544 MINGW64 ~ $ pwd /c/Users/wangdachu 2、Windows安装kubectl到当前…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...

Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...