当前位置: 首页 > news >正文

C#中的工厂模式

在C#中,工厂模式(Factory Pattern) 是一种常见的设计模式,它属于创建型模式,主要用于定义一个用于创建对象的接口,让子类决定实例化哪一个类。通过使用工厂模式,客户端代码不需要直接实例化具体的类对象,而是通过工厂类来创建对象,这样可以解耦客户端与具体产品的关系,增加系统的灵活性和可扩展性。

工厂模式的分类

工厂模式有几种不同的变种,其中常见的包括:

  1. 简单工厂模式(Simple Factory)
  2. 工厂方法模式(Factory Method)
  3. 抽象工厂模式(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 中&#xff0c;要将一个元素固定在页面的某个位置&#xff0c;可以使用 position: fixed 属性。以下是详细的代码示例和中文解释&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta n…...

Transformers快速入门代码解析(六):注意力机制——Transformer Encoder:执行顺序解析

Transformer Encoder&#xff1a;执行顺序解析 引言执行顺序解析1. 设置模型检查点和分词器2. 输入预处理操作说明&#xff1a; 3. 加载模型配置configconfig 包含的主要参数常见配置&#xff08;BERT-base&#xff09; 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) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

CTF-PWN glibc源码阅读[1]: 寻找libc中堆结构的定义(2.31-0ubuntu9.16)

源代码在这里下载 来到malloc/malloc.c 在980行发现这段代码 // 定义最大 mmap 值为 -4 #define M_MMAP_MAX -4// 如果没有定义 DEFAULT_MMAP_MAX&#xff0c;则将其定义为 65536 #ifndef DEFAULT_MMAP_MAX #define DEFAULT_MMAP_MAX (65536) #endif// 引…...

宏集eXware物联网网关在水务管理系统上的应用

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

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数&#xff08;用户自定义函数&#xff09; 一般指的是用户自己定义的单行函数。一进一出&#xff0c;函数接受的是一行中的一个或者多个字段值&#xff0c;返回一个值。比如MySQL中的&#xff0c;日期相关的dateDiff函数&#xff0c;字符串相关的substring函数。 先…...

#Java-JDK7、8的时间相关类,包装类

1. JDK7-Date类 我们先来看时间的相关知识点 世界标准时间: 格林尼治时间/格林威治时间(Greenwich Mean Time)简称GMT。目前世界标准时间(UTC)已经替换为:原子钟中国标准时间: 世界标准时间8小时 时间单位换算: 1秒1000毫秒 1毫秒1000微秒 1微秒1000纳秒 Date类 Date类…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...