新闻中心
C#怎么实现工厂模式 C#设计模式之简单工厂和工厂方法
工厂模式通过解耦对象创建提升代码可维护性,简单工厂用参数创建产品但违反开闭原则,工厂方法通过子类创建产品支持扩展且符合开闭原则,适用于产品频繁变化的场景。

工厂模式在C#中是一种常用的设计模式,主要用于对象的创建过程解耦。通过工厂类来决定创建哪种具体类型的对象,使客户端代码不直接依赖于具体类,提升代码的可维护性和扩展性。常见的工厂模式包括简单工厂和工厂方法模式。
简单工厂(Simple Factory)
简单工厂不是GoF 23种设计模式之一,但在实际开发中非常实用。它通过一个工厂类根据传入的参数决定创建哪一种产品对象。
核心结构:
- 定义一个产品接口或抽象类
- 多个具体产品类实现该接口
- 一个工厂类,包含一个静态方法用于创建产品实例
// 产品接口
public interface IProduct
{
void Use();
}
// 具体产品A
public class ConcreteProductA : IProduct
{
public void Use() => Console.WriteLine("使用产品A");
}
// 具体产品B
public class ConcreteProductB : IProduct
{
public void Use() => Console.WriteLine("使用产品B");
}
// 简单工厂
public class SimpleFactory
{
public IProduct CreateProduct(string type)
{
return type.ToLower() switch
{
"a" => new ConcreteProductA(),
"b" => new ConcreteProductB(),
_ => throw new ArgumentException("未知类型")
};
}
}
// 使用方式
var factory = new SimpleFactory();
IProduct product = factory.CreateProduct("a");
product.Use(); // 输出:使用产品A
优点是调用简单,缺点是新增产品时需要修改工厂类,违反开闭原则。
工厂方法模式(Factory Method Pattern)
工厂方法模式是GoF设计模式之一,它将对象的创建延迟到子类中进行,每个具体工厂负责创建对应的具体产品。
核心角色:
XmxCms企业网站管理系统2.0
原本这个程序只是本人两年前初学时练手的,最近拿出来进行了修改,所以叫XmxCms 企业网站管理系统2.0 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可
0
查看详情
- 抽象工厂(Factory):声明创建产品的方法
- 具体工厂(ConcreteFactory):实现工厂方法,返回具体产品
- 产品接口:定义产品行为
- 具体产品:实现产品接口
// 产品接口
public interface IProduct
{
void Use();
}
// 具体产品
public class ProductA : IProduct
{
public void Use() => Console.WriteLine("使用产品A");
}
public class ProductB : IProduct
{
public void Use() => Console.WriteLine("使用产品B");
}
// 抽象工厂
public abstract class Factory
{
public abstract IProduct CreateProduct();
}
// 具体工厂
public class ConcreteFactoryA : Factory
{
public override IProduct CreateProduct() => new ProductA();
}
public class ConcreteFactoryB : Factory
{
public override IProduct CreateProduct() => new ProductB();
}
// 使用方式
Factory factory = new ConcreteFactoryA();
IProduct product = factory.CreateProduct();
product.Use(); // 输出:使用产品A
当需要增加新产品时,只需添加新的具体工厂和产品类,无需修改原有代码,符合开闭原则。
两种模式对比与选择
简单工厂适合产品种类固定、变化少的场景,代码简洁易懂。工厂方法更适合产品经常扩展的系统,虽然类数量增多,但结构更灵活。
如果未来可能引入更多产品类型,建议直接使用工厂方法模式。也可以结合反射机制进一步优化对象创建过程,避免硬编码。
基本上就这些。理解它们的区别和适用场景,能帮助你在C#项目中更好地组织对象创建逻辑。不复杂但容易忽略细节。
以上就是C#怎么实现工厂模式 C#设计模式之简单工厂和工厂方法的详细内容,更多请关注其它相关文章!
# 迭代
# 瓷砖店推广和营销策略
# 厦门seo培训课程
# 汽车网站建立湖北推广
# 许昌百度seo网站优化价格
# 岳池县推广营销公司地址
# 宝山seo找哪家
# 湖南网站建设博客
# 株洲快手营销推广哪里买
# 潍坊数据优化招聘网站有哪些
# 常州网站建设详细内容
# 多个
# 是一种
# go
# 重试
# 如何使用
# 只需
# 开闭
# 子类
# 企业网站
# 管理系统
# c#
# 区别
# switch
# 编码
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
高德地图沿途添加点失败如何解决 高德多点规划方法
优化Log4j2控制台输出性能:解决异步日志瓶颈
曝R星经典之作开发图 设计简陋但信息密集!
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
微信聊天记录怎么加密_微信聊天记录加密方法
顺丰国际快递查询 国际件官方查询入口
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
FullCalendar 自定义按钮样式定制指南
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
Golang如何使用net/url解析URL_Golang URL解析与处理方法
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
J*aScript实现单选按钮与关联输入框的联动禁用教程
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
steam官方入口大全 steam账号注册及操作指南
响应式容器内容自动缩放与宽高比维持教程
ArrayList与LinkedList操作复杂度详解:遍历与修改
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址
J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
mc.js游戏直达 mc.js网页免下载版本秒进地址
Win11怎么关闭快速启动_Win11彻底关机设置教程
解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误
C++ vector二维数组定义_C++ vector of vector用法
Go语言中JSON数据解析与字段访问教程
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置
iwriter统一登录平台 iwrite账号密码登录页面
基于动态规划的房屋花卉种植最小成本算法详解
千牛数据看板网页版_千牛数据看板网页版访问方法
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
CSS图片焦点样式实现教程:理解与应用tabindex属性
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
反效果?《战地6》免费试玩开启后玩家数不升反降
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
微博网页版主页入口 微博官方网站免登录访问
2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析
qq游戏网页版直接玩_qq游戏免下载快速入口
理解Python模块与全局变量的作用域管理


2025-11-06
浏览次数:次
返回列表
"a" => new ConcreteProductA(),
"b" => new ConcreteProductB(),
_ => throw new ArgumentException("未知类型")
};
}
}
// 使用方式
var factory = new SimpleFactory();
IProduct product = factory.CreateProduct("a");
product.Use(); // 输出:使用产品A