新闻中心

C# 如何实现一个工厂模式_C# 工厂模式实现方法详解

2025-11-02
浏览次数:
返回列表
工厂模式通过解耦对象创建提升扩展性;简单工厂用静态方法创建实例;工厂方法由子类决定实例化;抽象工厂用于创建相关产品族;三者分别适用于固定类型、单一等级结构和多平台组件系统。

c# 如何实现一个工厂模式_c# 工厂模式实现方法详解

工厂模式是一种创建型设计模式,用来解耦对象的创建过程。在 C# 中,通过接口或抽象类定义产品,再由具体工厂类负责实例化对象,从而让程序具备更好的扩展性和维护性。下面详细介绍如何在 C# 中实现工厂模式。

简单工厂模式(Simple Factory)

简单工厂不是真正的设计模式,但非常实用。它通过一个静态方法根据参数决定返回哪种类型的实例。

步骤:

  • 定义一个产品接口或抽象类
  • 创建多个具体产品类实现该接口
  • 编写一个工厂类,包含一个静态方法用于创建对象

示例代码:

// 产品接口
public interface IProduct
{
    void Use();
}
<p>// 具体产品A
public class ConcreteProductA : IProduct
{
public void Use() => Console.WriteLine("使用产品A");
}</p><p>// 具体产品B
public class ConcreteProductB : IProduct
{
public void Use() => Console.WriteLine("使用产品B");
}</p><p>// 简单工厂
public class SimpleFactory
{
public static IProduct CreateProduct(string type)
{
return type.ToUpper() switch
{
"A" => new ConcreteProductA(),
"B" => new ConcreteProductB(),
_ => throw new ArgumentException("无效的产品类型")
};
}
}</p>

调用方式:

IProduct product = SimpleFactory.CreateProduct("A");
product.Use(); // 输出:使用产品A

工厂方法模式(Factory Method)

工厂方法模式将对象的创建延迟到子类。每个具体工厂负责创建对应的具体产品,符合开闭原则。

核心结构:

  • 定义一个创建对象的抽象方法(工厂方法)
  • 具体工厂继承并实现该方法
  • 产品仍然通过统一接口操作

示例代码:

// 抽象工厂
public abstract class Factory
{
    public abstract IProduct CreateProduct();
}
<p>// 具体工厂A
public class ConcreteFactoryA : Factory
{
public override IProduct CreateProduct() => new ConcreteProductA();
}</p><p>// 具体工厂B
public class ConcreteFactoryB : Factory
{
public override IProduct CreateProduct() => new ConcreteProductB();
}</p>

使用方式:

简单库存管理系统 简单库存管理系统

本系统是一个基于工厂模式的三层架构项目,基于VS2005 开发,结构简洁,配合动软Codematic代码生成器,可以使开发效率事半功倍,倍感轻松。本系统主要功能 1,物品类别管理 实现了物品类别的添加、修改、删除功能,方便库存物品分类管理。 2,物品管理 实现物品添加、修改,管理员可实时对物品做出库、入库记录,也可查看详细历史出入库记录。 3,商家管理 实现商家添加、修改、删除功能,方便公司和客户

简单库存管理系统 0 查看详情 简单库存管理系统
Factory factory = new ConcreteFactoryA();
IProduct product = factory.CreateProduct();
product.Use(); // 输出:使用产品A

抽象工厂模式(Abstract Factory)

当需要创建一系列相关或依赖对象时,使用抽象工厂模式。它可以生产多个产品族中的产品,而无需指定具体类。

适用场景:比如不同主题的 UI 组件(按钮、文本框等)。

示例代码:

// 抽象产品:按钮
public interface IButton
{
    void Render();
}
<p>// 具体产品:Windows 按钮
public class WindowsButton : IButton
{
public void Render() => Console.WriteLine("渲染 Windows 风格按钮");
}</p><p>// 具体产品:Mac 按钮
public class MacButton : IButton
{
public void Render() => Console.WriteLine("渲染 Mac 风格按钮");
}</p><p>// 抽象工厂
public interface IGuiFactory
{
IButton CreateButton();
}</p><p>// 具体工厂:Windows 工厂
public class WindowsFactory : IGuiFactory
{
public IButton CreateButton() => new WindowsButton();
}</p><p>// 具体工厂:Mac 工厂
public class MacFactory : IGuiFactory
{
public IButton CreateButton() => new MacButton();
}</p>

客户端使用:

IGuiFactory factory = new MacFactory(); // 或 new WindowsFactory()
IButton button = factory.CreateButton();
button.Render(); // 输出:渲染 Mac 风格按钮

选择合适的工厂模式

三种模式各有用途:

  • 简单工厂适用于产品种类固定、变化少的情况
  • 工厂方法适合单一产品等级结构,扩展新类型方便
  • 抽象工厂适合多产品族、跨平台组件系统

结合依赖注入(DI),可以进一步提升工厂模式的灵活性。例如,在 ASP.NET Core 中注册工厂服务,运行时动态解析所需实例。

基本上就这些。掌握这几种工厂模式的写法和区别,能让你在实际开发中更好地管理对象创建逻辑,减少耦合,提高代码可测试性与可维护性。

以上就是C# 如何实现一个工厂模式_C# 工厂模式实现方法详解的详细内容,更多请关注其它相关文章!


# 这对  # 虹口区谷歌网站优化定制  # 常德网络seo优化报价  # 网站关键字优化业务  # seo架构图解  # 抖音营销推广运营矩阵视频系统  # 韶关营销型网站推广  # 大兴seo外链专员招聘  # telegram seo交流  # 临沂营销推广厂家有哪些  # 进口网站建设价格多少  # 开源  # 有什么区别  # 本系统  # windows  # 微软  # 适用于  # 库存管理系统  # 多个  # 如何实现  # 子类  # .net  # 简单工厂模式  # c#  # 区别  # win  # switch  # mac 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: iwriter统一登录平台 iwrite账号密码登录页面  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  C++指针和引用有什么区别_C++内存管理核心概念深度解析  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  J*aScript数据结构转换:将对象数组按类别分组  C++ vector二维数组定义_C++ vector of vector用法  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  poki网页游戏推荐_poki免费游戏平台入口  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  微信网页版官方快速登录入口 微信网页版网页版账号直达  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  大象笔记网页版入口 印象笔记网页版登录入口  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  Typer应用中灵活处理命令行参数的令牌化与解析  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  J*aScript中在Map循环中检测并处理空数组元素  12306选座如何查看座位示意图_12306座位示意图解读与使用  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  高德地图沿途添加点失败如何解决 高德多点规划方法  J*a实现学校排课程序_面向对象结构化项目示例  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  React Router 嵌套组件中 URL 重定向问题的解决方案  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  J*aScript:在map操作中高效处理空数组  Go语言中Map值调用指针接收器方法的限制与应对  J*aScript中高效管理与清空动态列表:避免循环陷阱  b站怎么取消点赞_b站点赞取消操作方法  蛙漫移动版在线看 蛙漫手机浏览器直达入口  Python异步编程实践:使用Binance API构建实时交易数据流  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示 

搜索