设计模式(Unity)——更新中
设计模式
文章目录
- 设计模式
- 工厂模式
- 创建方法(Create Methods)
- 简单工厂(Simple Factory)
- 工厂方法(Method Factory)
- 抽象工厂(Abstract Factroy)
- 策略模式
工厂模式
创建方法(Create Methods)
调用构造函数进行封装,隐藏创建细节体现代码意图,增强代码可维护性
例如我们有一个部门,部门中有一个工种程序员
public class Programmer { } // 程序员类
public class Department // 部门类
{// 这是一个创建方法(也可以写成静态)public Programmer CreateEmployee(){return new Programmer();}
}
调用创建方法
Department department = new Department();
Programmer programmer = department.CreateEmployee();
简单工厂(Simple Factory)
现在部门增加了一个工种,设计师工种,那么我们使用简单工厂模式,通过给定参数的不同来创建不同的对象
// 工种枚举
public enum EEmployeeType
{Programmer,Designer
}
public class Employee {} // 工种父类
public class Programmer : Employee { } // 程序员类
public class Designer : Employee { } // 设计师类
public class Department // 部门类
{// 用简单工厂实现创建方法public Employee CreateEmployee(EEmployeeType employeeType){Employee employee = new Employee();switch (employeeType){case EEmployeeType.Programmer:employee = new Programmer();break;case EEmployeeType.Designer:employee = new Designer();break;default:throw new System.ArgumentException("Invalid employee type");}return employee;}
}
调用创建方法
Department department = new Department();
Employee programmer = department.CreateEmployee(EEmployeeType.Programmer);
Employee designer = department.CreateEmployee(EEmployeeType.Designer);
工厂方法(Method Factory)
- 创建子类工厂
如果现在又又需要增加工种,那么在简单工厂的基础上我们只能通过修改CreateEmployee方法的实现细节,不符合违背了开闭原则(对象应该对扩展开放,修改封闭),那么我们使用工厂方法,将对象的创建方法下发到子类工厂中
public abstract class Department // 父类工厂
{public abstract Employee CreateEmployee();
}public class ITDepartment : Department // 程序员工厂
{public override Employee CreateEmployee(){return new Programmer();}
}public class UIDepartment : Department // 设计师工厂
{public override Employee CreateEmployee(){return new Designer();}
}
创建方法调用,通过使用不同的子类工厂来完成创建,这样扩展新工种时只需要创建类和子类工厂
ITDepartment itDepartment = new ITDepartment();
itDepartment.CreateEmployee();
UIDepartment uiDepartment = new UIDepartment();
uiDepartment.CreateEmployee();
2.创建模板方法
如果这个时候需要对每个新创建的员工都实现一个注册账户的方法,可以发现从创建对象到注册的业务执行是固定的,但是每一个接口所对应的具体实现不同
加入注册方法
public abstract class Employee // 工种父类
{public abstract string RegisterAccount(); // 注册方法
}public class Programmer : Employee // 程序员类
{public override string RegisterAccount(){return "IT" + Random.Range(0, 100);}}public class Designer : Employee // 设计师类
{public override string RegisterAccount(){return "UI" + Random.Range(100, 200);}
}
实现父类工厂中的模板方法
public abstract class Department // 部门抽象类
{protected abstract Employee CreateEmployee();public Employee Onboard(){employee = CreateEmployee(); // 具体实现通过子类employee.RegisterAccount();return employee;}
}
创建方法调用
ITDepartment itDepartment = new ITDepartment();
itDepartment.Onboard();UIDepartment uiDepartment = new UIDepartment();
uiDepartment.Onboard();
抽象工厂(Abstract Factroy)
加入程序员有程序项目,设计师有设计项目,使用抽象工厂
public abstract class Project // 项目父类
{public abstract void AssignTo(); // 项目接口
}public class ITProject : Project // 程序项目类
{public override void AssignTo(){Debug.Log("Assign an IT to project");}
}public class UIProject : Project // 设计师项目类
{public override void AssignTo(){Debug.Log("Assign an UI to project");}
}
重构部门抽象类,加入项目类
public abstract class Department // 部门抽象类
{public abstract Employee CreateEmployee();public abstract Project CreateProject();
}
public class ITDepartment : Department
{public override Employee CreateEmployee(){return new Programmer();}public override Project CreateProject(){return new ITProject();}}public class UIDepartment : Department
{public override Employee CreateEmployee(){return new Designer();}public override Project CreateProject(){return new UIProject();}
}
创建工厂管理类,实现一对多的关系,例如一个程序员部门,可以有多个项目,多个员工
// 工厂管理类
public class DepartManager
{private Department _department;public List<Project> _projects;public Dictionary<string, Employee> _employees;public DepartManager(Department department){_department = department;}public Project CreateProject(){if (_projects == null) _projects = new List<Project>();Project project = _department.CreateProject();_projects.Add(project);return project;}public string CreateEmployee(){if (_employees == null) _employees = new Dictionary<string, Employee>();Employee employee = _department.CreateEmployee();string accountNo = employee.RegisterAccount();_employees.Add(accountNo, employee);return accountNo;}
}
方法调用
DepartManager itDepManager = new DepartManager(new ITDepartment());
itDepManager.CreateProject();
itDepManager.CreateEmployee();DepartManager uiDepManager = new DepartManager(new UIDepartment());
itDepManager.CreateProject();
itDepManager.CreateEmployee();
策略模式
相关文章:
设计模式(Unity)——更新中
设计模式 文章目录 设计模式工厂模式创建方法(Create Methods)简单工厂(Simple Factory)工厂方法(Method Factory)抽象工厂(Abstract Factroy) 策略模式 工厂模式 创建方法…...
小程序中引入下载到本地的iconfont字体图标加载不出来问题解决
我这个是uniapp项目,字体图标都是一样的,在vue项目中web端、uniapp运行到h5都没问题,但是运行到小程序加载不出来,报错如下: 不让用本地路径,所以我们要转为base64编码,这里给大家提供一个工具,它可以把本地字体文件转为base64:transfonter 进入官网后,第一步: …...
百度富文本禁止编辑
<script type"text/javascript">$(function () {editorcontent new baidu.editor.ui.Editor();editorcontent.render(authentication);//禁用代码editorcontent.ready(function () {editorcontent.setDisabled();});try {editorcontent.sync();} catch (err) …...
C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信
1. 前言 RabbitMQ是一个流行的开源消息队列系统,支持多种消息协议,广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中,我们将熟悉如何使用C与RabbitMQ进行消息通信。 2. 准备工作 在 Windows 平台上…...
头歌网络安全(11.12)
头歌禁止复制解决 必须先下篡改猴!!!! 头歌复制助手 Educoder Copy Helperhttps://scriptcat.org/zh-CN/script-show-page/1860 Java生成验证码 第1关:使用Servlet生成验证码 任务描述 本关任务:使用se…...
洛谷 P1725 琪露诺(线段树优化dp)
题目链接 https://www.luogu.com.cn/problem/P1725 思路 我们令 d p [ i ] dp[i] dp[i]表示琪露诺移动到第 i i i个格子时能够获得的最大冰冻指数。 显然,状态转移方程为: d p [ i ] m a x ( d p [ i ] , d p [ k ] a [ i ] ) dp[i] max(dp[i],dp…...
【LeetCode】【算法】19. 删除链表的倒数第N个结点
LeetCode 19. 删除链表的倒数第N个结点 题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 思路 思路:快慢指针,快指针先移动n步,快慢指针再同时移动直到快指针到达链表末尾,此…...
Python爬虫 | 爬取豆瓣电影Top250的数据
简单记录一下,实现爬取豆瓣电影Top 250的数据。 这里我使用requests库来发送HTTP请求,以及BeautifulSoup库来解析HTML页面。 1.安装requests和BeautifulSoup库。 如果没有安装,可以通过以下命令安装: pip install requests bea…...
mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误
1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量(我的是在~/.bash.profile) export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…...
完全清除:苹果手机照片怎么彻底删除
在使用iPhone的过程中,由于拍摄积累的照片往往会占用大量存储空间。有时候,我们需要彻底删除这些照片以释放空间或保护隐私。苹果手机照片怎么彻底删除?在此,本文将与你分享一些实用的技巧。 彻底删除的重要性 彻底删除照片不仅涉…...
高德地图多个图片组成标点(自定义点标记内容)
图标的实现自定义点标记内容...
02-1_MVCC版本链清理
MVCC-版本链清理 文章目录 MVCC-版本链清理简介依赖机制Purge 操作的触发时机版本链清理的详细过程示例操作流程延迟清理配置和监控总结 简介 MySQL 中的 MVCC 机制通过版本链来管理数据的多版本存储,以支持高并发的读写操作。然而,随着事务的进行&…...
探索Python视频处理的瑞士军刀:ffmpeg-python库
文章目录 **探索Python视频处理的瑞士军刀:ffmpeg-python库**第一部分:背景介绍第二部分:ffmpeg-python库是什么?第三部分:如何安装ffmpeg-python库?第四部分:简单库函数使用方法1. 视频转码2. …...
进程间通信 - 通道
进程间通信 - 通道 什么是管道? 进程间的通信方式有五种,分别为:管道、信号量、共享内存、消息队列和套接字。 管道:本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于…...
华为数通HCIA系列第5次考试-【2024-46周-周一】
文章目录 1、子网掩码有什么作用,和IP地址是什么关系,利用子网掩码可以获取哪些信息?2、已知一个IP地址是192.168.1.1,子网掩码是255.255.255.0,求其网络地址3、已知某主机的IP地址是192.168.100.200,子网掩…...
【Linux】如何通过终端命令查看当前可用网络 WIFI + 设置已配置网络的连接优先级 + 连接/断连网络
【Linux】通过命令行,查看当前可用网络 WIFI 设置已配置网络的连接优先级 连接网络 列出所有可连接网络 nmcli device wifi list这个命令会列出所有可连接 wifi,*表示当前连接。 IN-USE BSSID SSID MODE CHAN …...
华为路由策略配置
一、AS_Path过滤 要求: AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接,引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…...
Debezium日常分享系列之:异步 Debezium 嵌入式引擎
Debezium日常分享系列之:异步 Debezium 嵌入式引擎 动机目标非目标保留Kafka Connect模型计划的更改线程池并行运行源任务存储偏移量并发处理CDC事件禁用CDC事件的完全排序自定义记录处理器并行处理记录的选项存储偏移量引擎状态和生命周期防止资源泄漏异常处理退出…...
leetcode206. Reverse Linked List
Given the head of a singly linked list, reverse the list, and return the reversed list. 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 思路一:双指针 class Solu…...
【MATLAB源码-第291期】基于matlab的AMI编码解码系统仿真,输出各个节点波形。
操作环境: MATLAB 2022a 1、算法描述 AMI(Alternate Mark Inversion,交替极性反转)是一种广泛使用的编码方法,尤其是在通信系统中,用于传输二进制数据。AMI编码的特点是在传输过程中,对于0信…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...
