新闻中心

C#怎么实现工厂模式 C#设计模式之简单工厂和工厂方法

2025-11-06
浏览次数:
返回列表
工厂模式通过解耦对象创建提升代码可维护性,简单工厂用参数创建产品但违反开闭原则,工厂方法通过子类创建产品支持扩展且符合开闭原则,适用于产品频繁变化的场景。

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

原本这个程序只是本人两年前初学时练手的,最近拿出来进行了修改,所以叫XmxCms 企业网站管理系统2.0 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可

XmxCms企业网站管理系统2.0 0 查看详情 XmxCms企业网站管理系统2.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模块与全局变量的作用域管理 

搜索