C# 设计模式之简单工厂模式
总目录
前言
本文是个人基于C#学习设计模式总结的学习笔记,希望对你有用!
1 基本介绍
- 简单工厂模式 定义:用于创建对象,将对象的创建与使用分离。
简单工厂模式中用于创建实例的方法是静态(static)方法,因而简单工厂模式又被称为静态工厂方法模式,它属于类创建型模式,但不属于GOF23种设计模式。
-
工厂模式有三种类型:
- 简单工厂模式(或称 静态工厂方法模式)
- 工厂方法模式
- 抽象工厂模式
-
工厂模式是一种创建型模式,负责封装和管理对象的创建;主要用来解耦代码,将对象的创建和使用分离,使得代码更加灵活和可维护。
-
简单工厂模式是工厂模式的基本形式,通过定义一个工厂类,类中定义一个静态方法,该方法根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
-
简单工厂包含三大角色:
- 抽象产品(抽象类)
- 定义了产品的规范,描述了产品的主要特征和功能。
- 它是工厂类创建的所有对象的父类,封装了各种产品对象的共有方法。
- 具体产品(子类)
- 继承抽象产品的子类,某个产品的具体实现类。
- 具体工厂(实例化对象类)
- 它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;
- 可以被外界直接调用,创建所需的产品对象
- 抽象产品(抽象类)
2 适用场景
适用于创建对象需要大量重复的步骤,或者需要依赖于其它对象的情况,它提供了一种方式来封装多个相关或依赖对象的创建逻辑。
- 当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式
- 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式
3 实现方式
假如我们有个抽象产品:鞋子(所有种类鞋子的父类),鞋子内有个抽象方法Show
//抽象父类,抽象产品public abstract class AbstractShoes{//该方法负责输出 产品名称public abstract void Show();}
现在该产品有两个子类:LeatherShoes(皮鞋)和GymShoes(体育鞋)
public class LeatherShoes : AbstractShoes{public override void Show(){Console.WriteLine($"我是:{nameof(LeatherShoes)} !");}}public class GymShoes : AbstractShoes{public override void Show(){Console.WriteLine($"我是:{nameof(GymShoes)} !");}}
现在张三鞋穿坏了,需要自己做鞋子,于是张三开始自己动手做鞋子:
//定义一个张三 的类,里面有个做鞋子的行为(方法)public class ZhangSan{//张三制作鞋子的办法public AbstractShoes MakeShoes(string type){if (type == "LeatherShoes"){return new LeatherShoes();}else if (type == "GymShoes"){return new GymShoes();}else{throw new ArgumentException("Invalid type.");}}// 张三自己想做鞋子的时候public void Main(){//自己做皮鞋AbstractShoes abstractShoes1 = MakeShoes("LeatherShoes");abstractShoes1.Show();//自己做体育鞋AbstractShoes abstractShoes2 = MakeShoes("GymShoes");abstractShoes2.Show();}}
张三虽然可以自己制作鞋子,但是不免有些太麻烦了,太耗时间了;正好他家附近有个鞋厂,因此他想偷懒,下次没鞋子了就去鞋厂买,因此代码改进如下:
//定义一个造鞋工厂类,专门负责生产鞋子public class ShoesFactory{//定义一个公有的静态方法,传入鞋子类别,然后返回一个具体类型的鞋子实例public static AbstractShoes MakeShoes(string type){if (type == "LeatherShoes"){return new LeatherShoes();}else if (type == "GymShoes"){return new GymShoes();}else{throw new ArgumentException("Invalid type.");}}}
此时对于张三来说,就简单了,张三需要鞋子穿就直接去找鞋子工厂了
public class ZhangSan{public void Main(){//去鞋厂买皮鞋AbstractShoes abstractShoes1 = ShoesFactory.MakeShoes("LeatherShoes");abstractShoes1.Show();//去鞋厂买体育鞋AbstractShoes abstractShoes2 = ShoesFactory.MakeShoes("GymShoes");abstractShoes2.Show();}}
在这里我们发现,对于而言,不需要再去学习那么多做鞋子的技能,只需要掏钱买些即可。张三可以将时间花在更为重要的事情上面。
4 优缺点分析
通过简单工厂模式的实现,你会发现我们只是把 变化的点 移到了工厂类中而已,好像没有太大变化;
因为如果张三想再来一双凉鞋的时候,此时我们还是需要修改工厂类中的造鞋方法(增加一个类型的判断),在没实现简单工厂前,我们同样也会做同样的修改,只不过是修改张三自己的造鞋方法。从这里我们要知道每个模式都不是万能的,只是某一类问题的解决方案,都会有优缺点。
-
优点:实现了对象的创建和使用分离,使得代码更加灵活和可维护(总的一点)。
- 简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。
- 简单工厂模式实现了对责任的分割。
- 简单工厂模式也起到了代码复用的作用,因为之前的实现(张三自己做鞋的情况)中,换了一个人同样要去在自己的类中实现做鞋的方法,然后有了简单工厂之后,需要鞋子的所有人都不用那么麻烦了,只需要负责消费就可以了。此时简单工厂的造鞋技能就让所有客户共用了。
-
缺点:增加新的产品需要修改工厂接口,违背了“开放-封闭原则”。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。
- 简单工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响(通俗地意思就是:一旦鞋厂关门了,很多不会造鞋的人就没鞋穿了)
总结
以上就是今天要讲的内容,本文介绍了简单工厂模式的使用,希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。
参考资料
C#设计模式(2)——简单工厂模式
C#中工厂模式详解
相关文章:
C# 设计模式之简单工厂模式
总目录 前言 本文是个人基于C#学习设计模式总结的学习笔记,希望对你有用! 1 基本介绍 简单工厂模式 定义:用于创建对象,将对象的创建与使用分离。 简单工厂模式中用于创建实例的方法是静态(static)方法,因而简单工厂…...
mac中dyld[5999]: Library not loaded: libssl.3.dylib解决方法
需要重新安装下openssl3.0版本 brew reinstall openssl3.0 安装后执行还是报错,需要找到openssl的安装路径 /opt/homebrew/Cellar/openssl3.0/3.0.14/lib/ 将libssl.3.dylib和libcrypto.3.dylib拷贝到自己的二进制文件同目录下,再执行二进制文件就可…...
python 容器
文章目录 数据容器特点比较通用序列操作示例代码1. s.index(x[, i[, j]])2. s.count(x)示例代码注意事项代码解释输出结果 数据容器的通用转换1. list()2. tuple()3. str()4. set()5. dict()6. enumerate()7. zip()8. sorted()9. reversed()10. map()11. filter()12. join()示例…...
微信小程序中Component中如何监听属性变化
1.在父组件的.json文件中引入子组件: "usingComponents": {"articleList":"../../components/articleList/articleList",}2.在父组件中给子组件绑定数据 <articleList num"{{number}}"></articleList>3.子组…...
【Python 逆向滑块】(实战五)逆向滑块,并实现用Python+Node.js 生成滑块、识别滑块、验证滑块、发送短信
逆向日期:2024.08.03 使用工具:Python,Node.js 本章知识:滑块距离识别,滑块轨迹生成,验证滑块并获取【validate】参数 文章难度:中等(没耐心的请离开) 文章全程已做去敏处…...
微服务架构设计的最佳实践
在当今快速变化的软件开发环境中,微服务架构因其灵活性、可扩展性和可维护性而逐渐成为大型分布式系统的首选架构模式。然而,成功实施微服务架构并非易事,它要求开发团队遵循一系列最佳实践来确保系统的可靠性、效率和可管理性。本文将探讨微…...
样式与特效(3)——实现一个测算页面
这次我们使用前端实现一个简单的游戏页面,理论上可以增加很多玩法,,但是这里为了加深前端的样式和JS点击事件,用该案例做练习。 首先需要掌握手机端的自适应,我们是只做手机端玩家页面 。需要允许自适应手机端页面, 用…...
芯片制造过程4光刻机
以下内容均取自哔哩哔哩up主谈三圈 链接: 芯片制造详解04:光刻技术与基本流程|国产之路不容易 1.光刻原理 通过光掩膜、光刻机、光刻胶进行光刻 光掩膜是芯片的蓝图,是一张刻有集成电路板图的玻璃遮光板光刻机就像一台纳米级的打印机&#…...
Nexus3 Repository代理pypi设置与应用
目录 1. 创建Blob库并指定路径 2. 创建pypi阿里镜像源 3. 创建pypi腾讯镜像源 4. 创建一个pypi组管理 5. 配置pip 6. 下载测试 扩展:配置好后无法下载解决思路。 Nexus 存储库中的 Blob 存储是指一种用于存储大量非结构化数据的技术。在 Nexus 存储库的上下文…...
PMP–知识卡片--燃起图
燃起图用两条曲线分别绘制随时间的推移、完成的工作量和总工作量的变化情况。它不仅能清晰地展示项目进度,还是对团队成员的一种激励形式。 使用燃起图可以更好地了解进度、范围变更和预期完成时间,它为所有相关方提供了更清晰的进度状态。 燃起图根据工…...
63 epoll服务器 (ET模式)
基于LT模式修改,并加入前面的应用层计算器,实现稍完整的服务器功能 1.修改tcp_socket.hpp,新增非阻塞读和非阻塞写接口 2.对于accept返回的new_sock加上EPOLLET这样的选项 注意:此代码暂时未考虑listen_sock ET的情况,…...
AI Agent
一,什么是AI Agent? AI Agent(人工智能代理)是一种能够自主执行任务和决策的智能系统。它通常具备感知环境、处理信息和采取行动的能力,能够模拟人类的思维和行为方式。 它可以是软件程序,也可以是嵌入式…...
select
select函数简介: select是Linux中常用的多路复用IO机制,它允许程序同时监控多个文件描述符(可以是套接字socket,也可以是普通文件)的读、写和异常事件。 #include <sys/select.h> #include <sys/time.h> …...
按照指定格式打印pprint()
【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 按照指定格式打印 pprint() [太阳]选择题 根据给定的Python代码,哪个选项是正确的? from pprint import pprint data { name: A, age: 30, hobbies:…...
Study--Oracle-07-ASM常用维护操作(五)
一、ASM创建新的磁盘组 1、查看系统中可用的磁盘 set lines 150; col name for a35; col path for a35; select group_number,path, state, name, total_mb, free_mb from v$asm_disk; 2、磁盘组操作 创建磁盘组 create DISKGROUP DATADGV2 EXTERNAL REDUNDANCY DISK /dev…...
[Git][分支管理][上]详细讲解
目录 1.理解分支2.创建分支3.切换分支4.合并分支5.删除分支 1.理解分支 感性理解:分支可以理解为平行宇宙,但是在用户需要的时候,可以将两个平行宇宙合并,此时两个平行宇宙的效果将会"叠加"理性理解:每次提…...
C语言指针(1)
目录 一、内存和地址 1、生活中的例子 2、内存的关系 二、指针变量和地址 1、&符号,%p占位符 2、一个简单的指针代码。 3、理解指针 4、解引用操作符 5、指针变量的大小。 三、指针变量类型的意义 1、指针解引用的作用 2、指针指针 3、指针-指针 4…...
C语言中的指针与数组
C语言中的指针与数组是编程中非常基础且强大的概念,它们之间有着紧密的联系和相互转换的可能性。深入理解这两个概念对于编写高效、可维护的C程序至关重要。以下将详细探讨C语言中的指针与数组,包括它们的基本概念、关系、应用以及一些高级话题。 一、指…...
CentOS7.9升级OpenSSL1.1.1w
下载 https://www.openssl.org/source/old/1.1.1/index.html 安装依赖 yum install gcc libffi-devel zlib* openssl-devel libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc perl make 解压 tar -zxvf openss…...
环境搭建:如何安装和使用 MySQL Connector/J——与 MySQL Community Server 的关系
环境搭建:如何安装和使用 MySQL Connector/J—— MySQL Community Server 的关系 在 Java 项目中,与 MySQL 数据库的交互需要使用 MySQL Connector/J 驱动。本文将介绍 MySQL Connector/J 的作用、安装方法以及与 MySQL Community Server 的关系…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
