C# 工厂方法模式

devtools/2024/9/25 4:34:20/

栏目总目录


概念

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

角色

  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}
}

总结

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


http://www.ppmy.cn/devtools/88563.html

相关文章

vue自定义指令elementui日期组件手动输入

html <el-form-item label"开始时间" prop"beginTime"><!-- :picker-options"pickerOptions" --><el-date-pickerv-model"formData.beginTime"v-elDateFormateditablevalue-format"yyyyMMdd"type"date&…

HarmonyOS 用List组件实现组合列表项

界面分析&#xff1a; 由于整体UX设计图符合从上至下的布局&#xff0c;所以可以采用Column组件作为外层容器 简介&#xff1a; 最上方的标题可以使用Text组件进行加载渲染中间的Banner图和简介分别可以使用Image组件和Text组件进行加载最后一部分可以看作是一个列表&#xf…

图片转换之heic转jpg(使用ImageMagick)

缘由&#xff1a;iphone的图库&#xff0c;用jpg拍照保存后内存占比较大&#xff0c;heic格式会微缩不少。问题来了&#xff0c;电脑不能直接小图预览heic。 分析&#xff1a;现在就是解决小图预览的问题&#xff08;大图用wps可以看&#xff09; 解决&#xff1a;查找了一些…

距离-小米2023笔试(codefun2000)

题目链接 距离-小米2023笔试(codefun2000) 题目内容 在x轴上&#xff0c;给定当前坐标x0 &#xff0c;以及若干个坐标及坐标的值xi :vali &#xff0c;要求找到离x0最近的那个坐标并输出其值val。如果恰好在两个坐标的正中间&#xff0c;那么输出它们值的平均值。 输入描述 包…

《LeetCode热题100》---<5.③普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第五道&#xff1a;缺失的第一个正数&#xff08;困难&#xff09; 第五道&#xff1a;缺失的第一个正数&#xff08;困难&#xff09; 方法一&#xff1a;将数组视为哈希表 class Solution {public int firstMissingPosi…

Android14音频进阶之使能内核debugfs:Adsp输出日志(七十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更…

string用法总结

1.介绍 string是一个字符串类&#xff0c;和char类型类似&#xff0c;string是动态的&#xff0c;会自动调整大小&#xff0c;节省了不必要的空间。 1.初始化及定义 //头文件 #include<string>//1. string str1; //生成空字符串//2. string str2("123456789"…

C-V2X通信协议

C-V2X&#xff08;Cellular Vehicle to Everything&#xff0c;蜂窝车联网&#xff09;是一种利用蜂窝网络将车辆与一切事物连接的技术&#xff0c;它基于3G/4G/5G等蜂窝网通信技术演进形成&#xff0c;是当前车联网领域的主流技术标准之一。以下是对C-V2X通信协议的详细介绍&a…