设计模式1:C#开发中使用创建型的工厂模式和行为型的策略模式

一、接口设计的好处

三大好处:解耦、可复用、可扩展。

二、简单工厂模式

【三要素】能创建具体产品的工厂、抽象产品(接口)、具体产品

【基本用法】字符串=>创建对象=>调用其方法

// 产品接口
public interface IProduct
{void Operation();
}// 具体产品 A
public class ProductA : IProduct
{public void Operation() => Console.WriteLine("ProductA Operation");//表达式主体方法写法,就是写括号
}// 具体产品 B
public class ProductB : IProduct
{public void Operation() => Console.WriteLine("ProductB Operation");
}// 工厂类
public class ProductFactory
{public static IProduct CreateProduct(string type){return type switch //简化版switch 语句,和if,else一个意思{"A" => new ProductA(),"B" => new ProductB(),_ => throw new ArgumentException("Invalid product type")};}
}// 主程序
class Program
{static void Main(){string input = "A";IProduct product = ProductFactory.CreateProduct(input);product.Operation(); // Output: ProductA Operation}
}

【思考】以下方法也可以调用接口,为什么非要用工厂模式呢?

string input = "A";
if (input=="A")
{var product = new ProductA();product.Operation();
}

        请看图,我告诉你为什么要用工厂模式:

1.假如后续我加了产品CDEFGHI...,我仅需要添加代码到工厂类和具体实现 (底层代码),而无需修改高层代码,做到了开闭原则

2.用工厂模式实现了解耦,避免了高层代码和底层代码紧密的联系,使得高层代码无需关注具体的实现过程,做到了依赖于抽象,不依赖于具体(依赖倒置原则)。

三、抽象工厂模式

【思考】简单工厂和抽象工厂的区别

简单工厂模式:适用于单一类型的对象创建。
抽象工厂模式:适合创建一系列相关的产品族,每个产品族包含多个不同类型的产品。它提供了更高的灵活性和扩展性。

【代码实现】 

// 抽象产品 A
public interface IProductA
{void OperationA();
}// 抽象产品 B
public interface IProductB
{void OperationB();
}// 具体产品 A1
public class ProductA1 : IProductA
{public void OperationA() => Console.WriteLine("ProductA1 OperationA");
}// 具体产品 B1
public class ProductB1 : IProductB
{public void OperationB() => Console.WriteLine("ProductB1 OperationB");
}// 具体产品 A2
public class ProductA2 : IProductA
{public void OperationA() => Console.WriteLine("ProductA2 OperationA");
}// 具体产品 B2
public class ProductB2 : IProductB
{public void OperationB() => Console.WriteLine("ProductB2 OperationB");
}// 抽象工厂
public interface IFactory
{IProductA CreateProductA();IProductB CreateProductB();
}// 具体工厂 1
public class Factory1 : IFactory
{public IProductA CreateProductA() => new ProductA1();public IProductB CreateProductB() => new ProductB1();
}// 具体工厂 2
public class Factory2 : IFactory
{public IProductA CreateProductA() => new ProductA2();public IProductB CreateProductB() => new ProductB2();
}// 主程序
class Program
{static void Main(){IFactory factory = new Factory1();IProductA productA = factory.CreateProductA();IProductB productB = factory.CreateProductB();productA.OperationA(); // Output: ProductA1 OperationAproductB.OperationB(); // Output: ProductB1 OperationB}
}

四、策略模式

【三要素】环境类(用户这个对象)、策略接口、实现接口

【基本用法】对象不同=>选择的策略不同=>实现策略不同 

【demo】

using System;public interface IDiscountStrategy
{double ApplyDiscount(double price);
}public class GoldMemberDiscount : IDiscountStrategy
{public double ApplyDiscount(double price){return price * 0.95; // 5% off}
}public class RegularMemberDiscount : IDiscountStrategy
{public double ApplyDiscount(double price){return price; // No discount}
}public class Ticket
{private readonly IDiscountStrategy _discountStrategy;public Ticket(IDiscountStrategy discountStrategy){_discountStrategy = discountStrategy;}public double GetPrice(double originalPrice){return _discountStrategy.ApplyDiscount(originalPrice);}
}public class Program
{public static void Main(){double originalPrice = 100.0;//策略模式:分为两步Ticket goldMemberTicket = new Ticket(new GoldMemberDiscount());//1.选择策略Console.WriteLine("Gold Member Price: " + goldMemberTicket.GetPrice(originalPrice));//2.执行策略Ticket regularMemberTicket = new Ticket(new RegularMemberDiscount());Console.WriteLine("Regular Member Price: " + regularMemberTicket.GetPrice(originalPrice));}
}

 【思考】为什么要选取策略模式?其实分析思路和工厂模式差不多:
1.符合开闭原则,新加策略可以直接加实现策略即可,而工厂模式还需要修改工厂类和实现产品。
2.消除if-else语句,将算法逻辑封装在了具体策略中,高层代码(主程序)只需要调用GetPrice 方法即可(用户的身份信息可由查表获得,无需if判断)。
3.复用性强,一套算法可以多次使用。

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

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

相关文章

应用开发---VTK放大镜(区域放大)功能实现

VTK 医学图像处理---放大镜/区域放大功能 本博文主要内容为:实现放大镜的源代码;实现思路;具体代码说明。 目录 VTK 医学图像处理---放大镜/区域放大功能 简介: 1 放大镜源代码 1 wxInteractorStyleImage 类源代码 2 wxMagnifierAcotor类源代码 3 Magnifier.cpp 源…

Android 打开 GBK项目如何设置成UTF-8

1.标题 今天打开一个eclipse老项目,编码格式为GBK,Android studio导入项目报错,本人想到一个方案就是批量修改文件格式从 GBK到 UTF-8,这样可以一键解决问题 2.开发脚本 使用前请备份代码 使用前请备份代码 使用前请备份代码…

NLP从零开始------文本中阶处理之序列到序列模型(完整版)

1. 序列到序列模型简介 序列到序列( sequence to sequence, seq2seq) 是指输入和输出各为一个序列(如一句话) 的任务。本节将输入序列称作源序列,输出序列称作目标序列。序列到序列有非常多的重要应用, 其中最有名的是机器翻译( machine translation), 机…

WebRTC协议下的视频汇聚融合技术:EasyCVR视频技术构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展,视频数据的规模急剧增长,对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…

思科IP访问控制列表3

#网络安全技术实现# #任务三扩展访问控制列表的控制3# #1配置计算机的IP 地址、子网掩码和网关 #2配置Switch-A的主机名称,创建vlan 10,20,30,并将Fa0/1划入vlan 10,Fa0/2划入vlan 20,G0/1划入vlan 30 Switch(config)#hostname Switch-A S…

「OC」iOS事件处理流程

「OC」初识iOS事件处理流程 文章目录 「OC」初识iOS事件处理流程触摸事件触摸事件的响应周期事件 响应者UIEventUITouchUIResponder 触摸流程系统响应阶段APP响应阶段寻找最佳响应者 构成响应链 寻找最佳响应者和响应链的区别总结参考资料 触摸事件 iOS的事件有好几种&#xf…

DriveLM的baseline复现

DriveLM是一篇很有意思的工作,把自动驾驶跟MLLM结合到一起了,实现端到端的感知or决策规划。 Repo:https://github.com/OpenDriveLab/DriveLM 该工作是基于nuScenes数据集做的,官方paper里给出了数据的具体构建方式,感…

SpringBoot依赖之Spring Boot DevTools热部署开发增效工具

摘要:Spring项目又大又重,依赖多,编译启动慢,怎么提高研发效率呢?方法之一热部署! 概念 Spring Boot DevTools 依赖名称: Spring Boot DevTools功能描述: Provides fast application restarts, LiveRelo…

25k的自动化测试面试题,原来都是这样~

小编热衷于收集整理资源,记录踩坑到爬坑的过程。希望能把自己所学,实际工作中使用的技术、学习方法、心得及踩过的一些坑,记录下来。也希望想做软件测试的你一样,通过我的分享可以少走一些弯路,可以形成一套自己的方法…

AI绘画时代的自媒体引流攻略:如何实现粉丝暴涨与盈利

一、AI绘画在自媒体引流和赚钱中的应用 创作独特视觉内容,吸引粉丝关注 AI绘画技术可以帮助自媒体从业者创作出独一无二的视觉内容,这些内容在社交媒体上具有很高的辨识度和吸引力。通过以下方式,AI绘画助力引流和赚钱: &#xf…

SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

SpringBoot+Vue实现大文件上传(断点续传-后端控制(一))

SpringBootVue实现大文件上传(断点续传) 1 环境 SpringBoot 3.2.1,Vue 2,ElementUI,spark-md5 2 问题 在前一篇文章,我们写了通过在前端控制的断点续传,但是有两个问题,第一个问题&…

铁打的程序员轻易“不哭”-我的大模型创业近2年来的感悟

楔子 2022年11月,GPT-3发布那一刻,我被AI的强大能力所震撼,意识到“超级个体”时代的来临。自那时起,我开始全心投入创业,经历了许多苦乐交织的时光。 2023年6月,我尝试将AI应用于智能营销导购&#xff0…

云原生架构概念

云原生架构概念 云原生架构(Cloud Native Architechtrue)作为一种现代软件开发的革新力量,正在逐渐改变企业构建、部署和管理应用程序的方式。它的核心优势在于支持微服务架构,使得应用程序能够分解为独立、松耦合的服务&#xf…

window系统怎么设置闹钟提醒?分享一个桌面提醒设置办法

在日常工作和生活中,我们常常会因忙碌而遗忘一些重要事项。对于很多使用电脑办公的用户来说,如果能在桌面上设置闹钟提醒,无疑会大大提高工作效率,减少遗漏。那么,如何设置这样的闹钟提醒呢? 这时&#xf…

ElementUI实现el-table组件的合并行功能

前言 有时遇到一些需求,需要实现ElementUI中,el-tabled组件合并单元格的功能,稍微了解一下它的数据格式,不难可以写出比合并方法。但是在鼠标经过单元行时,会出现高亮的行与鼠标经过的行不一致的BUG。因此还需要实现c…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

无线麦克风哪个牌子的好,麦克风哪个好,无线麦克风品牌推荐

​在自媒体日益繁荣的当下&#xff0c;内容创作成为了许多人追求的目标。对于视频内容创作者而言&#xff0c;出色的内容是成功的基石&#xff0c;而高质量的设备则是保证作品品质的关键。为了提升视频音质&#xff0c;拥有一款专业的无线麦克风是不可或缺的。 然而&#xff0…

PHP智能匹配轻松预订自习室在线订座系统小程序源码

智能匹配&#xff0c;轻松预订——自习室在线订座系统 &#x1f4da;【开篇&#xff1a;告别排队&#xff0c;迎接智能学习新时代】&#x1f4da; 还在为找不到合适的自习室座位而烦恼吗&#xff1f;是不是每次去图书馆或自习室都要提前好久去排队占位&#xff1f;现在&#…

太速科技-1路万兆光纤SFP+和1路千兆网络 FMC子卡模块

1路万兆光纤SFP和1路千兆网络 FMC子卡模块 一、概述 该板卡是基于kc705和ml605的fmc 10g万兆光纤扩展板设计&#xff0c;提供了1路万兆光纤SFP和1路千兆网络接口。可搭配我公司开发的FPGA载卡使用。载卡可参考&#xff1a;ID204 SFP&#xff08;10 Gigabit Small…