当前位置: 首页 > news >正文

C# 工厂方法模式

栏目总目录


概念

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。这种模式的主要目的是将对象的创建与使用解耦,使得系统更加灵活和可扩展。

角色

  1. Product(产品角色):定义了产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的共同父类或接口。

  2. Concrete Product(具体产品角色):实现了Product接口的具体类,被具体工厂类所创建。

  3. Creator(创建者角色):声明了工厂方法,该方法是一个返回Product类型对象的方法,但返回的Product类型对象是在子类中实现的。通常还提供一个用于创建产品对象的接口。

  4. Concrete Creator(具体创建者角色):实现了Creator接口中定义的工厂方法,返回一个Concrete Product实例。

好处

  1. 解耦:将产品的创建与使用解耦,使得系统更加灵活和可扩展。
  2. 符合开闭原则:新增产品类时,无需修改工厂类代码,只需新增具体产品类和具体工厂类即可。
  3. 提高灵活性:通过子类来决定创建哪个具体产品对象,可以在运行时动态地决定创建哪种产品对象。

应用场景

  1. 当一个类不知道它所必须创建的对象的类时。
  2. 当一个类希望由它的子类来指定它所创建的对象时。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时。

示例代码

// Product 角色
public interface IDocument
{void Display();
}// Concrete Product 角色
public class TextDocument : IDocument
{public void Display(){Console.WriteLine("Displaying Text Document");}
}public class PDFDocument : IDocument
{public void Display(){Console.WriteLine("Displaying PDF Document");}
}// Creator 角色
public interface IDocumentFactory
{IDocument CreateDocument();
}// Concrete Creator 角色
public class TextDocumentFactory : IDocumentFactory
{public IDocument CreateDocument(){return new TextDocument();}
}public class PDFDocumentFactory : IDocumentFactory
{public IDocument CreateDocument(){return new PDFDocument();}
}// 客户端代码
class Program
{static void Main(string[] args){IDocumentFactory factory1 = new TextDocumentFactory();IDocument doc1 = factory1.CreateDocument();doc1.Display(); // 输出:Displaying Text DocumentIDocumentFactory factory2 = new PDFDocumentFactory();IDocument doc2 = factory2.CreateDocument();doc2.Display(); // 输出:Displaying PDF Document}
}

总结

工厂方法模式是一种非常有用的创建型设计模式,它通过定义一个创建对象的接口(即工厂接口),但将具体创建对象的任务交给子类去完成。这种模式的主要优点在于它将对象的创建与使用分离,降低了系统的耦合度,增加了系统的灵活性和可扩展性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 嵌入式linux相机 图像处理模块
  • 【学习方法】高效学习因素 ① ( 开始学习 | 高效学习因素五大因素 | 高效学习公式 - 学习效果 = 时间 x 注意力 x 精力 x 目标 x 策略 )
  • 解析Java中1000个常用类:HashSet类,你学会了吗?
  • 【保姆级系列:锐捷模拟器的下载安装使用全套教程】
  • Pr2024苹果(mac)版剪辑软件安装下载(附下载链接)
  • 计算机毕业设计Hadoop+Hive专利分析可视化 面向专利的大数据管理系统 专利爬虫 专利数据分析 大数据毕业设计 Spark
  • 基于切片法计算点云体积 双向最近点三维点排序
  • (计算机网络)物理层
  • 利用Dockerfile文件执行docker build自动构建镜像
  • 【java】单行注释(//)与多选注释(/* */)
  • 【iOS】APP仿写——天气预报
  • 文件解析漏洞集合
  • Python应用—简单邮件发送功能
  • 详解C/C++输入输出
  • 【保卫战】休闲小游戏 链游
  • 2017 年终总结 —— 在路上
  • Debian下无root权限使用Python访问Oracle
  • Linux CTF 逆向入门
  • Python_OOP
  • Spring Boot MyBatis配置多种数据库
  • TypeScript迭代器
  • Vim Clutch | 面向脚踏板编程……
  • 分享一份非常强势的Android面试题
  • 关于Java中分层中遇到的一些问题
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 算法-图和图算法
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (1)常见O(n^2)排序算法解析
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Python第六天)文件处理
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (顺序)容器的好伴侣 --- 容器适配器
  • (自用)gtest单元测试
  • .Net Core和.Net Standard直观理解
  • .NET Framework .NET Core与 .NET 的区别
  • .net MVC中使用angularJs刷新页面数据列表
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 调用php,php 调用.net com组件 --
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [AI StoryDiffusion] 创造神奇故事,AI漫画大乱斗!
  • [Algorithm][综合训练][kotori和气球][体操队形][二叉树中的最大路径和]详细讲解
  • [C++]多态
  • [C语言]——C语言常见概念(1)