新闻中心
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《神剑少女战记》发布实机演示


2025-11-02
浏览次数:次
返回列表