简单工厂、工厂、抽象工厂模式

简单工厂、工厂、抽象工厂模式

      • 1. **简单工厂模式(Simple Factory)**
      • 2. **工厂方法模式(Factory Method)**
      • 3. **抽象工厂模式(Abstract Factory)**
      • 对比总结

以下是三种工厂模式在C#中的实现与对比分析,结合具体代码示例说明:


1. 简单工厂模式(Simple Factory)

  • 核心:通过一个静态工厂方法根据参数返回不同产品实例。
  • C#示例(支付场景):
// 抽象产品
public interface IPayment { void Pay(decimal amount); }// 具体产品
public class Alipay : IPayment { public void Pay(decimal amount) => Console.WriteLine($"支付宝支付:{amount}元"); }
public class WeChatPay : IPayment { public void Pay(decimal amount) => Console.WriteLine($"微信支付:{amount}元"); }// 工厂类
public class PaymentFactory {public static IPayment Create(string type) {return type switch {"alipay" => new Alipay(),"wechat" => new WeChatPay(),_ => throw new ArgumentException("不支持的支付方式")};}
}// 客户端调用
var payment = PaymentFactory.Create("alipay");
payment.Pay(100);
  • 特点
    • ✅ 客户端与具体类解耦。
    • ❌ 新增支付方式需修改工厂类,违反开闭原则。

2. 工厂方法模式(Factory Method)

  • 核心:将对象创建延迟到子类,每个产品对应一个工厂。
  • C#示例(日志记录器场景):
// 抽象产品
public interface ILogger { void Log(string message); }// 具体产品
public class FileLogger : ILogger { public void Log(string message) => Console.WriteLine($"文件日志:{message}"); }
public class DatabaseLogger : ILogger { public void Log(string message) => Console.WriteLine($"数据库日志:{message}"); }// 抽象工厂
public interface ILoggerFactory { ILogger CreateLogger(); }// 具体工厂
public class FileLoggerFactory : ILoggerFactory {public ILogger CreateLogger() => new FileLogger();
}
public class DatabaseLoggerFactory : ILoggerFactory {public ILogger CreateLogger() => new DatabaseLogger();
}// 客户端调用
ILoggerFactory factory = new FileLoggerFactory();
var logger = factory.CreateLogger();
logger.Log("测试日志");
  • 特点
    • ✅ 新增日志类型只需添加新工厂类,符合开闭原则。
    • ❌ 类数量随产品增加而增多。

3. 抽象工厂模式(Abstract Factory)

  • 核心:创建一组相关产品族(如跨平台UI组件)。
  • C#示例(UI组件场景):
// 抽象产品族
public interface IButton { void Render(); }
public interface ITextBox { void Input(); }// Windows产品族
public class WinButton : IButton { public void Render() => Console.WriteLine("Windows风格按钮"); }
public class WinTextBox : ITextBox { public void Input() => Console.WriteLine("Windows风格文本框输入"); }// Mac产品族
public class MacButton : IButton { public void Render() => Console.WriteLine("Mac风格按钮"); }
public class MacTextBox : ITextBox { public void Input() => Console.WriteLine("Mac风格文本框输入"); }// 抽象工厂
public interface IUIFactory {IButton CreateButton();ITextBox CreateTextBox();
}// 具体工厂
public class WinUIFactory : IUIFactory {public IButton CreateButton() => new WinButton();public ITextBox CreateTextBox() => new WinTextBox();
}
public class MacUIFactory : IUIFactory {public IButton CreateButton() => new MacButton();public ITextBox CreateTextBox() => new MacTextBox();
}// 客户端调用
IUIFactory factory = new WinUIFactory();
var button = factory.CreateButton();
button.Render();
  • 特点
    • ✅ 保证同一产品族的兼容性(如所有Windows组件风格一致)。
    • ❌ 扩展新产品类型(如ICheckbox)需修改所有工厂接口。

对比总结

维度简单工厂工厂方法抽象工厂
创建目标单一产品单一产品一组相关产品族
扩展性需修改工厂类新增工厂子类新增产品族易,扩展产品类型难
适用场景支付方式选择日志记录器跨平台UI套件

💡 演进逻辑

  • 简单工厂 → 工厂方法:解决开闭原则问题。
  • 工厂方法 → 抽象工厂:支持产品族创建。

引用链接:
1.深入解析工厂模式及其C#实现 - CSDN博客
2.c#简单工厂、工厂方法与抽象工厂的区别分析 - CSDN博客
3.C#设计模式教程(1):简单工厂模式 - CSDN下载
4.2-1 简单工厂模式(Simple Factory) - bravo1988
5.c#中工厂模式详解 - 博客园
6.《C#设计模式》 工厂三兄弟之 【简单工厂模式】,【工厂方法模式】,【抽象工厂模式】 - CSDN
7.C#设计模式(4)——抽象工厂模式 - CSDN
8.设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别 - 腾讯云
9.c#语法-47设计模式之简单工厂模式 - 哔哩哔哩
10.深入理解23种设计模式之五分钟学会工厂&抽象工厂模式 - 哔哩哔哩
11.工厂模式分为哪三种类型 - 资料速递员
12.简单工厂模式:创建型模式的轻量级实现 - 盖世傻白甜
13.工厂模式解析:三种模式的优缺点与使用场景 - 度小视
14.day09_03简单工厂和抽象工厂模式 - 哔哩哔哩
15.7、【设计模式】之3种工厂模式的优缺点,使用场景,以及代码示例。 - 哔哩哔哩
16.简单工厂模式解析与应用 - 度小视
17.工厂方法模式解析与应用 - 度小视
18.千锋java培训:Java设计模式视频教程-创建型模式-简单工厂模式 - 千锋教育
19.movin2333 - 博客园
20.C#设计模式之工厂模式的工厂方法 - 爱吃油麦菜
21.C#设计模式之工厂模式 - CSDN博客
22.C#中的工厂模式:实现与应用 - CSDN博客
23.C# 常用设计模式有哪些 - 博客园
24.C# 设计模式——简单工厂模式、工厂模式、抽象工厂模式 - 博客园
25.3种工厂模式!让代码更灵活🔥 - 晶影帧
26.长安红颜画赵阳 - 长安红颜画赵阳
27.c# 假设一个基类,有很多个子类,用工厂模式去控制生成方法合适吗? - 次元科技

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910083.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Redis中实现缓存功能

Redis 是一种高性能的键值存储系统,广泛用于实现缓存功能。它通过将数据存储在内存中,能够快速读写数据,从而显著提高应用程序的性能。在Redis中实现缓存功能需要结合数据读写策略、失效机制及性能优化方案。 一、Redis作为缓存的核心优势 …

Kafka消费者客户端源码深度解析:从架构到核心流程

在Kafka生态系统中,消费者客户端作为数据消费的入口,其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码,通过核心组件解析、流程拆解与源码分析,揭示其高性能消费背后的技术奥秘,并辅以架…

从0开始学习R语言--Day26--因果推断

很多时候我们在探讨数据的相关性问题时,很容易会忽略到底是数据本身的特点还是真的是因为特征的区分导致的不同,从而误以为是特征起的效果比较大。 这就好比测试一款新药是否真的能治病,假如吃药的患者康复的更快,那到底是因为药…

Python 中布尔值的使用:掌握逻辑判断的核心

在 Python 中,布尔值(bool)是进行逻辑判断的基础。布尔值只有两个可能的值:True 和 False。通过布尔值,你可以实现条件判断、循环控制以及其他逻辑操作。今天,就让我们一起深入探讨如何在 Python 中使用布尔…

IDEA 中 Tomcat 部署 Java Web 项目(Maven 多模块 非 Maven 通用版)(linux+windows)

引言 Java Web 开发中,Tomcat 是最常用的 Servlet 容器,而项目类型通常分为 Maven 管理(依赖自动处理、多模块聚合) 和 非 Maven 纯手工管理(手动引入 jar 包、配置项目结构)。本文覆盖 两种项目类型 的 T…

使用 React Native Web 实现三端统一开发

使用 React Native Web 实现三端统一开发 关键点 React Native Web 简介:React Native Web 是一个允许开发者使用 React Native 组件和 API 构建 Web 应用的库,支持在 iOS、Android 和 Web 上使用同一套代码。架构:通过 React DOM 渲染 Rea…

分享一个git上基于std::array实现的循环队列(Cycle Queue)模板类库

为充分利用向量空间,克服“假溢出”现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。 网上有很多关于循…

三维视频融合平台:如何构建动态感知的数字空间

分享大纲: 你的三维平台为何不能承载动态视频捷码打造三维视频融合平台的三步法则为何选择捷码 在智慧城市建设过程中,将实时视频与三维空间结合,已经成为一种主流趋势。传统视频监控模式,经常面临视频分散、操作复杂等问题。然而…

【AI Study】第五天,Matplotlib(5)- 颜色映射

文章概要 本文详细介绍 Matplotlib 的颜色映射功能,包括: 颜色映射类型颜色映射设置数据标准化颜色条 颜色映射类型 pcolormesh import matplotlib.pyplot as plt import numpy as np# 创建网格数据 x np.linspace(-3, 3, 100) y np.linspace(-3,…

DB2中合理使用INCLUDE关键字创建索引

DB2中合理使用 INCLUDE 关键字创建索引 1. 为何还需要 INCLUDE?——从索引的两大痛点说起 查询想“只读索引不回表”,却又不想把列都做键 → 联合索引空间膨胀,更新放大。唯一索引定位快,但只能返回键列数据 → 仍需 I/O 跳回数据…

基于Spring Boot的民宿管理系统设计与实现

目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅Spring Boot框架3. ✅Vue.js框架4. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 浏览后台首页1.2 预订信息管理1.3 入住信息管理1.4 退房信息管理1.…

大数据系统架构实践(一):Zookeeper集群部署

大数据系统架构实践(一):Zookeeper集群部署 文章目录 大数据系统架构实践(一):Zookeeper集群部署一、Zookeeper简介二、部署前准备三、部署Zookeeper集群1. 下载并解压安装包2. 配置zoo.cfg3. 设置日志目录…

《道德经》:探寻古老智慧中的哲学之光

我强烈推荐4本可以改变命运的经典著作: 《寿康宝鉴》在线阅读白话文《欲海回狂》在线阅读白话文《阴律无情》在线阅读白话文《了凡四训》在线阅读白话文 《道德经》作为道家经典,短短五千言,却字字珠玑,蕴含着超越时空的哲学智慧。…

科技赋能民生:中建海龙为民生改善注入新动力

在社会发展的进程中,民生改善始终占据着核心地位。住房、基础设施建设等民生领域的进步,直接关系到民众的生活质量与幸福感。中建海龙科技有限公司(以下简称“中建海龙”)作为建筑行业的创新引领者,凭借其强大的科技实…

BI 赋能,打造数据可视化看板新体验

BI 赋能,打造数据可视化看板新体验 引言 在当今数字化时代,数据成为企业决策的重要依据。如何从海量的数据中提取有价值的信息,并以直观、易懂的方式呈现出来,是企业面临的重要挑战。商业智能(BI)工具的出…

vue2设置自定义域名跳转

需求:首次登录域名为aa.com,之后登录系统后在系统内某个模块设置三级域名为second,之后退出登录到aa.com,登录进入系统后域名自动变为second.aa.com,最后退出的域名也是second.aa.com,通过不同的域名配置动态的登录页面…

“地标界爱马仕”再拓疆域:世酒中菜联袂赤水金钗石斛定义中国GI

“地标界爱马仕”再拓疆域:世酒中菜联袂赤水金钗石斛,定义中国GI奢侈品新高度 ——中世国际与贵州斛满多战略合作签约仪式在赤水举行 赤水市,2025年5月18日——被誉为“地标界爱马仕”的顶级奢侈品牌世酒中菜 (世界酒中国菜全球…

零基础、大白话,Vue3全篇通俗疗法(上):基础知识【看得懂】

前言 最近有个小朋友想了解Vue前端技术,但他只懂一些HTML基础,让我用最简单的方式讲解。于是就有了这篇面向初学者的博文。 老手请绕行,本文专为新手准备。如果发现用词不当的地方欢迎留言指正,觉得对新手有帮助的话请收藏点赞。 …

JavaScript性能优化实战

JavaScript性能优化实战技术文章大纲 性能优化的重要性 解释为什么性能优化对用户体验和业务指标至关重要讨论核心Web指标(LCP、FID、CLS)与JavaScript性能的关系 代码层面优化 减少DOM操作,使用文档片段或虚拟DOM避免频繁的重绘和回流&a…

考研英语作文评分标准专业批改

考研英语作文专业批改经过官方评分标准严格对标,彻底改变你的作文提升方式,打开 懂试帝小程序 直达批改。 🎯 批改服务核心优势 ✨ 官方标准严格对标 完全按照考研英语官方五档评分制,从内容完整性、组织连贯性、语言多样性到语…