C#中的工厂模式
在C#中,工厂模式(Factory Pattern) 是一种常见的设计模式,它属于创建型模式,主要用于定义一个用于创建对象的接口,让子类决定实例化哪一个类。通过使用工厂模式,客户端代码不需要直接实例化具体的类对象,而是通过工厂类来创建对象,这样可以解耦客户端与具体产品的关系,增加系统的灵活性和可扩展性。
工厂模式的分类
工厂模式有几种不同的变种,其中常见的包括:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
下面分别介绍它们的实现方式及应用场景。
1. 简单工厂模式(Simple Factory)
简单工厂模式通过一个工厂类来决定实例化哪一个产品类。客户端通过调用工厂的一个方法来获取需要的产品对象。它的关键在于工厂类中包含了逻辑,用于创建不同类型的对象。
代码示例:
// 产品接口
public interface IProduct
{void Show();
}// 具体产品类
public class ProductA : IProduct
{public void Show(){Console.WriteLine("ProductA");}
}public class ProductB : IProduct
{public void Show(){Console.WriteLine("ProductB");}
}// 简单工厂类
public class ProductFactory
{public static IProduct CreateProduct(string type){switch (type){case "A":return new ProductA();case "B":return new ProductB();default:throw new ArgumentException("Invalid product type.");}}
}// 客户端代码
class Program
{static void Main(){IProduct productA = ProductFactory.CreateProduct("A");productA.Show();IProduct productB = ProductFactory.CreateProduct("B");productB.Show();}
}
解析:
- 产品接口(IProduct):定义了所有产品的公共接口。
- 具体产品类(ProductA, ProductB):实现了产品接口的具体类。
- 简单工厂类(ProductFactory):通过
CreateProduct
方法根据不同的输入参数创建不同类型的产品对象。
优缺点:
- 优点:简单易懂,适用于产品种类较少且变化不大的情况。
- 缺点:如果产品种类增多,工厂类的
CreateProduct
方法会越来越复杂,不利于扩展和维护。
2. 工厂方法模式(Factory Method)
工厂方法模式与简单工厂模式不同,它将对象的创建交给子类去实现,而不是由一个工厂类负责。这样每个工厂类只负责创建一种类型的对象,符合单一职责原则。工厂方法模式通过抽象工厂来声明创建对象的接口,由具体的子工厂去实现该接口。
代码示例:
// 产品接口
public interface IProduct
{void Show();
}// 具体产品类
public class ProductA : IProduct
{public void Show(){Console.WriteLine("ProductA");}
}public class ProductB : IProduct
{public void Show(){Console.WriteLine("ProductB");}
}// 工厂方法接口
public abstract class ProductFactory
{public abstract IProduct CreateProduct();
}// 具体工厂类
public class ProductAFactory : ProductFactory
{public override IProduct CreateProduct(){return new ProductA();}
}public class ProductBFactory : ProductFactory
{public override IProduct CreateProduct(){return new ProductB();}
}// 客户端代码
class Program
{static void Main(){ProductFactory factoryA = new ProductAFactory();IProduct productA = factoryA.CreateProduct();productA.Show();ProductFactory factoryB = new ProductBFactory();IProduct productB = factoryB.CreateProduct();productB.Show();}
}
解析:
- 产品接口(IProduct):定义产品的公共行为。
- 具体产品类(ProductA, ProductB):实现产品接口的具体类。
- 工厂方法接口(ProductFactory):声明一个创建产品的抽象方法
CreateProduct
。 - 具体工厂类(ProductAFactory, ProductBFactory):实现了
CreateProduct
方法,创建具体的产品实例。
优缺点:
- 优点:符合开闭原则,新增产品时只需要添加新的工厂类,而不需要修改现有代码。
- 缺点:需要创建很多具体的工厂类,增加了系统的复杂性。
3. 抽象工厂模式(Abstract Factory)
抽象工厂模式提供一个接口,用于创建一系列相关或依赖的对象,而不需要指定具体的类。它通常用于需要创建多个相关对象的场景,且这些对象具有一致的风格、产品族。
代码示例:
// 产品A接口
public interface IProductA
{void Show();
}// 产品B接口
public interface IProductB
{void Show();
}// 具体产品A
public class ProductA1 : IProductA
{public void Show(){Console.WriteLine("ProductA1");}
}public class ProductA2 : IProductA
{public void Show(){Console.WriteLine("ProductA2");}
}// 具体产品B
public class ProductB1 : IProductB
{public void Show(){Console.WriteLine("ProductB1");}
}public class ProductB2 : IProductB
{public void Show(){Console.WriteLine("ProductB2");}
}// 抽象工厂接口
public interface IAbstractFactory
{IProductA CreateProductA();IProductB CreateProductB();
}// 具体工厂1
public class ConcreteFactory1 : IAbstractFactory
{public IProductA CreateProductA(){return new ProductA1();}public IProductB CreateProductB(){return new ProductB1();}
}// 具体工厂2
public class ConcreteFactory2 : IAbstractFactory
{public IProductA CreateProductA(){return new ProductA2();}public IProductB CreateProductB(){return new ProductB2();}
}// 客户端代码
class Program
{static void Main(){IAbstractFactory factory1 = new ConcreteFactory1();IProductA productA1 = factory1.CreateProductA();IProductB productB1 = factory1.CreateProductB();productA1.Show();productB1.Show();IAbstractFactory factory2 = new ConcreteFactory2();IProductA productA2 = factory2.CreateProductA();IProductB productB2 = factory2.CreateProductB();productA2.Show();productB2.Show();}
}
解析:
- 产品接口(IProductA, IProductB):分别定义了不同类型的产品接口。
- 具体产品类(ProductA1, ProductA2, ProductB1, ProductB2):实现了各自的产品接口。
- 抽象工厂接口(IAbstractFactory):声明了用于创建一系列产品的抽象方法。
- 具体工厂类(ConcreteFactory1, ConcreteFactory2):实现了抽象工厂接口,负责创建一系列相关的产品。
优缺点:
- 优点:当需要创建一组相关产品时,可以确保产品之间的一致性(即产品族),易于扩展。
- 缺点:如果产品族的种类增加,工厂的数量会急剧增加,系统复杂度较高。
总结
工厂模式在软件开发中非常常见,并且有不同的变种,适用于不同的场景:
- 简单工厂模式适合产品种类较少且变化不大的情况。
- 工厂方法模式适用于需要解耦对象创建和客户端代码的情况,增加了灵活性和可扩展性。
- 抽象工厂模式适合用于创建一系列相关的产品,尤其是在产品族的情况下,能够确保产品之间的一致性。
相关文章:
C#中的工厂模式
在C#中,工厂模式(Factory Pattern) 是一种常见的设计模式,它属于创建型模式,主要用于定义一个用于创建对象的接口,让子类决定实例化哪一个类。通过使用工厂模式,客户端代码不需要直接实例化具体…...

深度学习与持续学习:人工智能的未来与研究方向
文章目录 1. 持续学习与深度学习1.1 深度学习的局限1.2 持续学习的定义 2. 目标与心智2.1 奖励假说2.2 心智的构成 3. 对研究方法的建议3.1 日常写作记录3.2 中立对待流行趋势 1. 持续学习与深度学习 1.1 深度学习的局限 深度学习注重“瞬时学习”,如ChatGPT虽在语…...

OGRE 3D----4. OGRE和QML共享opengl上下文
在现代图形应用开发中,OGRE(Object-Oriented Graphics Rendering Engine)和QML(Qt Modeling Language)都是非常流行的工具。OGRE提供了强大的3D渲染能力,而QML则用于构建灵活的用户界面。在某些应用场景中,我们需要在同一个应用程序中同时使用OGRE和QML,并且共享OpenGL…...
【Umi】常用配置
具体见:alias 1. 基础配置 1)配置别名alias 2)配置sourcemap devtool 配置项 3)添加hash 4)图片转base64 inlineLimit 配置项 5)设置JS压缩方式 jsMinifier (webpack) 、jsMinifierOptions 配置项 6)设置umi插件 plugins 配置项 7)设置打包后资源导入的路…...
Windows加固脚本
echo off REM 清屏 cls title 安全策略设置批处理 color f0 echo **************************************** echo write by afei echo https://www.jianshu.com/u/ea4c85fbe8c7 echo **************************************** pause cls color 3f echo ********************…...

玩游戏常常出现vc++runtime library error R6025 这是什么意思,该怎么解决?
当玩游戏时常常出现“vc runtime library error R6025”错误,这通常表明微软C开发运行库组件存在问题。以下是对该错误及其解决方法的详细解释: 错误含义 “vc runtime library error R6025”是一个与Visual C运行时库相关的错误,该错误表明…...

AGX orin下电控制
AGX orin下电主要有两种,一种通过软件控制下电,另一种通过按键强制关机。下电流程和电脑关机流程类似。 AGX orin核心板与扩展板 AGX orin核心板由英伟达生产,不提供原理图,通过下图所示连接器与扩展板连接。 AGX orin扩展板&am…...
flutter 报错 error: unable to find git in your path.
项目issue:WIndows: "Unable to find git in your PATH." if terminal is not in admin mode Issue #123995 flutter/flutter 解决办法, 方法一:每次想要运行flutter的时候以管理员方式运行,比如以管理方式运行vsco…...

芯科科技率先支持Matter 1.4,推动智能家居迈向新高度
Matter 1.4引入核心增强功能、支持新设备类型,持续推进智能家居互联互通 近日,连接标准联盟(Connectivity Standard Alliance,CSA)发布了Matter 1.4标准版本。作为连接标准联盟的重要成员之一,以及Matter标…...

C语言数据相关知识:静态数据、越界与溢出
1、静态数组 在 C 语言中,数组一旦被定义后,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态…...

文本分析之余弦相似度
余弦相似度(Cosine Similarity)是一种用于衡量两个非零向量之间相似度的指标,尤其常用于文本分析和自然语言处理领域。其核心思想是通过计算两个向量的夹角余弦值来评估它们的相似性。具体而言,余弦相似度的值范围从-1到1,其中1表示两个向量完全相同,0表示它们之间没有相…...
【VUE3】【Naive UI】<n-button> 标签
【VUE3】【Naive UI】<n-button> 标签 **type**- 定义按钮的类型,这会影响按钮的颜色和样式。**size**- 设置按钮的大小。**disabled**- 布尔值,控制按钮是否处于禁用状态。**loading**- 布尔值,表示按钮是否处于加载状…...
css使盒子在屏幕的地点固定
在 CSS 中,要将一个元素固定在页面的某个位置,可以使用 position: fixed 属性。以下是详细的代码示例和中文解释: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta n…...
Transformers快速入门代码解析(六):注意力机制——Transformer Encoder:执行顺序解析
Transformer Encoder:执行顺序解析 引言执行顺序解析1. 设置模型检查点和分词器2. 输入预处理操作说明: 3. 加载模型配置configconfig 包含的主要参数常见配置(BERT-base) 4. 初始化 TransformerEncoder5. Transformer Encoder 的…...
图像小波去噪与总变分去噪详解与Python实现
目录 图像小波去噪与总变分去噪详解与实现1. 基础概念1.1 噪声类型及去噪问题定义1.2 小波去噪算法基础1.3 总变分去噪算法基础2. 小波去噪算法2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析3. 总变分去噪算法3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析4. 两种算法…...

【深度学习基础】预备知识 | 微积分
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
CTF-PWN glibc源码阅读[1]: 寻找libc中堆结构的定义(2.31-0ubuntu9.16)
源代码在这里下载 来到malloc/malloc.c 在980行发现这段代码 // 定义最大 mmap 值为 -4 #define M_MMAP_MAX -4// 如果没有定义 DEFAULT_MMAP_MAX,则将其定义为 65536 #ifndef DEFAULT_MMAP_MAX #define DEFAULT_MMAP_MAX (65536) #endif// 引…...

宏集eXware物联网网关在水务管理系统上的应用
一、前言 水务管理系统涵盖了对城市水网、供水、排水、污水处理等多个环节的监控与管理。随着物联网(IoT)技术的快速发展,物联网网关逐渐成为水务管理系统中的关键组成部分。 宏集物联网网关以其高效的数据采集、传输和管理功能,…...

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数
1. UDF函数(用户自定义函数) 一般指的是用户自己定义的单行函数。一进一出,函数接受的是一行中的一个或者多个字段值,返回一个值。比如MySQL中的,日期相关的dateDiff函数,字符串相关的substring函数。 先…...

#Java-JDK7、8的时间相关类,包装类
1. JDK7-Date类 我们先来看时间的相关知识点 世界标准时间: 格林尼治时间/格林威治时间(Greenwich Mean Time)简称GMT。目前世界标准时间(UTC)已经替换为:原子钟中国标准时间: 世界标准时间8小时 时间单位换算: 1秒1000毫秒 1毫秒1000微秒 1微秒1000纳秒 Date类 Date类…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...