当前位置: 首页 > 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类…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...