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

C# 工厂模式

一、概述

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在C#中,工厂模式通过定义一个公共接口或抽象类来创建对象,而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色:

1. 抽象产品(Abstract Product):定义了产品的接口,具体产品需要实现这个接口。

2. 具体产品(Concrete Product):实现了抽象产品接口的具体类。

3. 工厂(Factory):负责创建具体产品的工厂类,通常包含一个创建产品的方法。

工厂模式的优点:

封装性:工厂模式隐藏了创建对象的细节,只需要知道创建对象的入口,而无需关注创建过程,它提供了把对象创建与对象使用分离的方法。
可扩展性:在工厂模式中,添加一个新的产品类型,只需要在工厂类中添加一个创建新产品的方法,不会影响到现有代码。
复杂对象的创建:工厂模式允许创建复杂的对象,把对象的创建过程和使用过程分开,可以使代码更容易维护。
解耦:工厂模式减少了客户端和实际产品类之间的耦合,可以独立更改实现,不会影响到其他部分。
总之,工厂模式是一种常用的对象创建型模式,具有封装性,可扩展性,复杂对象的创建和解耦等优点,适用于解决复杂对象创建问题。

工厂模式的缺点:

增加了系统复杂度:因为要把创建对象的过程抽象成接口,所以会增加系统复杂度。
父类被污染:由于工厂模式中的工厂类继承自抽象类,如果需要扩展父类的功能,可能会把父类的代码污染。
不符合开闭原则:工厂模式的实现要求修改工厂类代码,在添加新产品时可能需要修改工厂类,这不符合开闭原则。
总的来说,工厂模式虽然有一些缺点,但是它还是一种非常有用的设计模式,在很多情况下都可以帮助我们简化代码,提高代码质量。

上面这些介绍,几乎都是没什么用的文案,目的是为了做人类高质量文章,各位可以不看,当然你想看也没问题,只是看了和没看效果是一样的。

二、代码的实现

新建一个控制台项目,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 工厂模式
{internal class Program{static void Main(string[] args){Factory factory = new Factory();// 创建具体产品AIProduct productA = factory.CreateProduct("A");productA.Operation();  // 输出:具体产品A的操作// 创建具体产品BIProduct productB = factory.CreateProduct("B");productB.Operation();  // 输出:具体产品B的操作Console.ReadKey();}}// 抽象产品接口public interface IProduct{void Operation();}// 具体产品类Apublic class ConcreteProductA : IProduct{public void Operation(){Console.WriteLine("具体产品A的操作");}}// 具体产品类Bpublic class ConcreteProductB : IProduct{public void Operation(){Console.WriteLine("具体产品B的操作");}}// 工厂类public class Factory{public IProduct CreateProduct(string productType){switch (productType){case "A":return new ConcreteProductA();case "B":return new ConcreteProductB();default:throw new ArgumentException("无效的产品类型");}}}
}

运行:

工厂模式的代码也是非常的简单,这里就不做解析了,下面直接上一个案例吧。 

三、案例

由于工厂模式的主要作用是创建实例,那么就以公司的年会抽奖为案例吧,首先,随机设置一个抽奖人,然后由系统随机奖品,奖品有现金,手机,平板电脑,抽奖完成后,公布抽奖结果。

新建一个 Winform 项目,将项目的输入类型改为控制台输出,你可能会问:“这么简单的操作干嘛介绍啊”?你还别说,上次就有人问我,你这是控制台项目还是 Winform 项目,控制台从哪里出来的,也不写清楚?

界面就两个按钮,源码我就不上传了

新建一个类 Prize,加入下面代码,下面好几个类写在一起了,我也懒的分了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 工厂模式案例
{/// <summary>/// 奖品的类型/// </summary>public enum PrizeType{/// <summary>/// 现金/// </summary>Money,/// <summary>/// 手机/// </summary>MobilePhone,/// <summary>/// 平板电脑/// </summary>Ipad}/// <summary>/// 奖品/// </summary>public abstract class Prize{/// <summary>/// 数量/// </summary>public int Number { get; set; }/// <summary>/// 获奖人/// </summary>public string Awardee { get; set; }/// <summary>/// 奖品类型/// </summary>public PrizeType PrizeTypes { get; set; }/// <summary>/// 随机数/// </summary>public Random Randoms { get; private set; } = new Random();/// <summary>/// 操作/// </summary>public abstract void Operation();/// <summary>/// 设置获奖人/// </summary>/// <param name="Awardee"></param>public abstract void SetAwardee(string Awardee);}/// <summary>/// 现金/// </summary>public class Money : Prize{public override void Operation(){Number = Randoms.Next(100, 1000);PrizeTypes =  PrizeType.Money;Console.WriteLine("得到奖品 类型:{0},数量是:{1}", PrizeTypes, Number);}public override void SetAwardee(string awardee){Awardee = awardee;Console.WriteLine("当前奖品的获得者是:{0}", awardee);}}/// <summary>/// 手机/// </summary>public class MobilePhone : Prize{public override void Operation(){Number = Randoms.Next(1, 3);PrizeTypes = PrizeType.MobilePhone;Console.WriteLine("得到奖品 类型:{0},数量是:{1}", PrizeTypes, Number);}public override void SetAwardee(string awardee){Awardee = awardee;Console.WriteLine("当前奖品的获得者是:{0}", awardee);}}/// <summary>/// 平板电脑/// </summary>public class Ipad : Prize{public override void Operation(){Number = Randoms.Next(1, 3);PrizeTypes = PrizeType.Ipad;Console.WriteLine("得到奖品 类型:{0},数量是:{1}", PrizeTypes, Number);}public override void SetAwardee(string awardee){Awardee = awardee;Console.WriteLine("当前奖品的获得者是:{0}", awardee);}}public class Factory{public static Prize CreateProduct(PrizeType prizeType){switch (prizeType){case PrizeType.Money:return new Money();case PrizeType.MobilePhone:return new MobilePhone();case PrizeType.Ipad:return new Ipad();default:return null;}}private Factory() { }}
}

Form1 的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 工厂模式案例
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//随机数private Random Randoms = new Random();//抽奖人列表private List<string> NameList = new List<string>() { "张三", "李四", "老王", "柱子", "狗剩", "铁蛋" };//当前的抽奖人private string Awardee = string.Empty;//奖品类型枚举的长度private int PrizeTypeCount = 0;private void Form1_Load(object sender, EventArgs e){PrizeTypeCount = System.Enum.GetNames(new PrizeType().GetType()).Length;}//抽奖人private void button1_Click(object sender, EventArgs e){int index = Randoms.Next(0, NameList.Count);Awardee = NameList[index];Console.WriteLine("当前的抽奖人是:{0}", Awardee);}//抽奖private void button2_Click(object sender, EventArgs e){if (string.IsNullOrEmpty(Awardee)){Console.WriteLine("请先确认抽奖人");return;}int index = Randoms.Next(0, PrizeTypeCount);PrizeType prizeType = (PrizeType)index;Prize prize = Factory.CreateProduct(prizeType);prize.Operation();prize.SetAwardee(Awardee);}}
}

运行:

这样一个简单的抽奖系统就实现了,有什么疑问或者建议,欢迎留言评论。

end

相关文章:

C# 工厂模式

一、概述 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在C#中&#xff0c;工厂模式通过定义一个公共接口或抽象类来创建对象&#xff0c;而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色…...

在云服务器上安装Jenkins

说明&#xff1a;Jenkins是一个部署项目的平台&#xff0c;通过Jenkins可以省去从项目开发–>部署项目之间的所有流程&#xff0c;做到代码提交即上线。本文介绍在云服务CentOS上安装Jenkins。 前提 安装Jenkins之前&#xff0c;先要在云服务上安装JDK、Maven、Git&#x…...

一文了解SpringBoot中的IOC

目录 1.什么是IOC 2.IOC容器 3.创建IOC容器 4.装配Bean到IOC容器 5.依赖注入 1.什么是IOC IOC&#xff1a;Inversion of Control 控制反转 Sping中我们把一个个对象称为Bean&#xff0c;以前我们实例一个对象的时候&#xff0c;都会直接New一个 而在Spring中&#xff0…...

docker-compose管理创建LNMP服务并运行Wordpress网站平台

文章目录 一&#xff0e;项目环境1. 环境描述2.项目需求 二&#xff0e;部署过程1.安装Docker2.安装Docker加速器3.Docker-Compose安装部署4.准备依赖文件、配置nginx5.配置mysql6.配置php7.编写docker-compose.yml8.验证 三.容器快照&#xff0c;然后将Docker镜像打包成tar包备…...

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型 文章目录 【宝藏系列】一文带你梳理 Linux 的五种 IO 模型&#x1f468;‍&#x1f3eb;前言1️⃣用户态和核心态1️⃣1️⃣用户态和核心态的切换 2️⃣进程切换3️⃣进程阻塞4️⃣文件描述符(fd, File Descriptor)5️⃣缓存I/O…...

【Python】模块、包

模块 Python模块&#xff08;Module&#xff09;&#xff0c;是一个Python文件&#xff0c;以.py结尾。模块能定义函数&#xff0c;类和变量&#xff0c;模块里也能保护可执行的代码。 不同模块&#xff0c;同名的功能&#xff0c;如果都被导入&#xff0c;那么后者会覆盖前者…...

CMAKE_CUDA_ARCHITECTURES针对Jetson Xavier或者Orin的设置

不同jetson设备对应不同的CMAKE_CUDA_ARCHITECTURES的设置&#xff0c;如下&#xff1a; # TX1, Nano ------ 53 # TX2 ------ 62 # AGX Xavier, NX Xavier ------ 72 # AGX Orin, NX Orin ----…...

sqlite3.OperationalError: unable to open database file解决方法

执行superset时&#xff0c;提示该错误&#xff1a;sqlite3.OperationalError: unable to open database file 由于superset里使用django设置sqlite3数据库。 应该属于django设置sqlite3数据库的问题&#xff1a; OperationalError: unable to open database file 原因 1&a…...

SSL核心概念 SSL类型级别

SSL&#xff1a;SSL&#xff08;Secure Sockets Layer&#xff09;即安全套接层&#xff0c;及其继任者传输层安全&#xff08;Transport Layer Security&#xff0c;TLS&#xff09;是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。 H…...

器件介绍TMP1826NGRR、TMP1826DGKR、TMP1827NGRR、TMP1075NDRLR数字温度传感器

一、TMP1826 具有 2Kb EEPROM 的 1-Wire、0.2C 精度温度传感器 器件介绍 TMP1826 是一款高精度、1-Wire 兼容的数字输出温度传感器&#xff0c;具有集成的 2Kb EEPROM 和 –55C 至150C 的宽工作温度范围。TMP1826 在 10C 至45C 的温度范围内提供 0.1C&#xff08;典型值&#…...

抖店必须绑定抖音账号吗?聊6个抖店不为人知的小细节,别外传

我是王路飞。 现在做抖店&#xff0c;比如绑定一个抖音账号吗&#xff1f; 了解过抖店的朋友都知道&#xff0c;之前开通抖音小店&#xff0c;是需要绑定一个抖音号作为店铺的官方账号的。 而且属于硬性规定&#xff0c;必须要绑定&#xff0c;否则店铺无法正常运营。 但是…...

如何搭建智能家居系统并通过内网穿透实现远程控制家中设备

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 前言 Home Assistant&…...

【趣味随笔】手机参数你真的看懂了吗?

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

微信小程序开发教学系列(4)- 数据绑定与事件处理

4. 数据绑定与事件处理 在微信小程序中&#xff0c;数据绑定和事件处理是非常重要的部分。数据绑定可以将数据和页面元素进行关联&#xff0c;实现数据的动态渲染&#xff1b;事件处理则是响应用户的操作&#xff0c;实现交互功能。本章节将详细介绍数据绑定和事件处理的基本原…...

C++避坑——most vexing parse问题

1."坑"的问题是什么&#xff1f; 先看一段代码&#xff1a; class Functor { public:void operator()(){std::cout << "我是线程的初始函数" << std::endl;} };int main() {std::thread t(Functor());// 强制高速编译器这是一个构造函数!t.j…...

利用lammps模拟蓝宝石在水润滑环境下的抛光

一 问题描述 蓝宝石&#xff08;Al2O3&#xff09;由于其独特的晶体结构&#xff0c;优异的物理化学特性&#xff0c;被广泛应用于航空航天等领域。高精尖的应用领域要求蓝宝石具有纳米级的表面粗糙度以及严格可控的亚表面缺陷。影响超精密加工最终性能的因素主要集中在工件表…...

3.BGP状态机和路由注入方式

BGP状态机 BGP路由的生成 不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将GP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。 BGP注入路由的方式有两种: Networkimport-route与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由…...

微信开发之一键创建微信群聊的技术实现

创建微信群 本接口为敏感接口&#xff0c;请查阅调用规范手册创建后&#xff0c;手机上不会显示该群&#xff0c;往该群主动发条消息手机即可显示。 请求URL&#xff1a; http://域名地址/createChatroom 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-T…...

设计模式二十:观察者模式(Observer Pattern)

定义了一种一对多的依赖关系&#xff0c;允许多个观察者&#xff08;也称为订阅者&#xff09;对象同时监听一个主题对象&#xff0c;当主题对象发生变化时&#xff0c;所有依赖于它的观察者都会收到通知并自动更新。 观察者模式的使用场景 观察者模式在许多场景中都可以发挥…...

Linux操作系统--CentOS使用初体验

我们安装好Linux的操作系统之后,下面就可以使用Linux操作系统了。我们一起来看看如何使用。 (1).桌面 我们在进入CentOS操作系统后可以发现一些和Windows操作系统相类似的情况。如:网络、时间显示、以及基本的软件等内容。 --创建文件、文件夹。 (2).操作终端 Linux中的终…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...