C#常见的设计模式-创建型模式

引言

在软件开发过程中,设计模式是一种被广泛采用的思想和实践,可以提供一种标准化的解决方案,以解决特定问题。设计模式分为三种类型:创建型模式、结构型模式和行为型模式。本篇文章将重点介绍C#中常见的创建型模式。
在这里插入图片描述


目录

    • 引言
    • 创建型模式的作用
    • 常见的创建型模式
      • 1. 简单工厂模式 (Simple Factory Pattern)
      • 2. 工厂方法模式 (Factory Method Pattern)
      • 3. 抽象工厂模式 (Abstract Factory Pattern)
      • 4. 单例模式 (Singleton Pattern)
      • 5. 原型模式 (Prototype Pattern)
      • 6. 建造者模式 (Builder Pattern)
    • 总结


创建型模式的作用

创建型模式主要关注对象的创建过程,并提供一种机制来创建对象,以使代码更加灵活、可维护和可扩展。创建型模式可以帮助我们降低系统的耦合度,使系统更具弹性,并且促进面向对象的设计原则的实施。

在这里插入图片描述


常见的创建型模式

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

简单工厂模式通过一个类来封装对象的创建过程,根据不同的条件返回不同的对象。在C#中,我们可以通过使用静态方法或者工厂类来实现简单工厂模式。

public class SimpleFactory
{public static IProduct CreateProduct(string type){switch (type){case "A":return new ProductA();case "B":return new ProductB();default:throw new ArgumentException("Invalid type");}}
}public interface IProduct
{void DoSomething();
}public class ProductA : IProduct
{public void DoSomething(){Console.WriteLine("ProductA does something.");}
}public class ProductB : IProduct
{public void DoSomething(){Console.WriteLine("ProductB does something.");}
}public class Client
{public void Main(){IProduct product = SimpleFactory.CreateProduct("A");product.DoSomething();}
}

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

工厂方法模式将对象的创建延迟到子类中进行,每个子类都负责创建自己的对象。这样可以通过使用多态性来实现在运行时动态地选择合适的对象。

public interface IProductFactory
{IProduct CreateProduct();
}public interface IProduct
{void DoSomething();
}public class ProductAFactory : IProductFactory
{public IProduct CreateProduct(){return new ProductA();}
}public class ProductBFactory : IProductFactory
{public IProduct CreateProduct(){return new ProductB();}
}public class ProductA : IProduct
{public void DoSomething(){Console.WriteLine("ProductA does something.");}
}public class ProductB : IProduct
{public void DoSomething(){Console.WriteLine("ProductB does something.");}
}public class Client
{public void Main(IProductFactory factory){IProduct product = factory.CreateProduct();product.DoSomething();}
}

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

抽象工厂模式提供了一个接口来创建一系列相互依赖或者有关联的对象,而不用指定他们具体的类。在C#中,我们可以通过使用抽象类或者接口来实现抽象工厂模式。

public interface IAbstractFactory
{IProductA CreateProductA();IProductB CreateProductB();
}public interface IProductA
{void DoSomething();
}public interface IProductB
{void DoSomething();
}public class ConcreteFactory1 : IAbstractFactory
{public IProductA CreateProductA(){return new ProductA1();}public IProductB CreateProductB(){return new ProductB1();}
}public class ConcreteFactory2 : IAbstractFactory
{public IProductA CreateProductA(){return new ProductA2();}public IProductB CreateProductB(){return new ProductB2();}
}public class ProductA1 : IProductA
{public void DoSomething(){Console.WriteLine("ProductA1 does something.");}
}public class ProductB1 : IProductB
{public void DoSomething(){Console.WriteLine("ProductB1 does something.");}
}public class ProductA2 : IProductA
{public void DoSomething(){Console.WriteLine("ProductA2 does something.");}
}public class ProductB2 : IProductB
{public void DoSomething(){Console.WriteLine("ProductB2 does something.");}
}public class Client
{public void Main(IAbstractFactory factory){IProductA productA = factory.CreateProductA();IProductB productB = factory.CreateProductB();productA.DoSomething();productB.DoSomething();}
}

4. 单例模式 (Singleton Pattern)

单例模式保证一个类只有一个实例,并提供一个全局访问点来访问该实例。在C#中,可以通过使用静态变量或者静态属性来实现单例模式。

public sealed class Singleton
{private static Singleton instance;private static readonly object lockObject = new object();private Singleton() { }public static Singleton Instance{get{if (instance == null){lock (lockObject){if (instance == null){instance = new Singleton();}}}return instance;}}
}public class Client
{public void Main(){Singleton singleton = Singleton.Instance;}
}

5. 原型模式 (Prototype Pattern)

原型模式使用原型来创建对象,通过复制现有的对象来创建新的对象。在C#中,可以通过实现ICloneable接口来实现原型模式。

public abstract class Prototype : ICloneable
{public abstract object Clone();
}public class ConcretePrototypeA : Prototype
{public override object Clone(){return (ConcretePrototypeA)this.MemberwiseClone();}
}public class ConcretePrototypeB : Prototype
{public override object Clone(){return (ConcretePrototypeB)this.MemberwiseClone();}
}public class Client
{public void Main(){Prototype prototypeA = new ConcretePrototypeA();Prototype prototypeB = new ConcretePrototypeB();Prototype cloneA = (Prototype)prototypeA.Clone();Prototype cloneB = (Prototype)prototypeB.Clone();}
}

6. 建造者模式 (Builder Pattern)

建造者模式将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。在C#中,可以通过使用链式调用或者指导者来实现建造者模式。

public class Product
{private string part1;private string part2;private string part3;public string Part1 { get { return part1; } }public string Part2 { get { return part2; } }public string Part3 { get { return part3; } }public Product(string part1, string part2, string part3){this.part1 = part1;this.part2 = part2;this.part3 = part3;}
}public interface IBuilder
{void BuildPart1(string value);void BuildPart2(string value);void BuildPart3(string value);Product GetResult();
}public class ConcreteBuilder : IBuilder
{private string part1;private string part2;private string part3;public void BuildPart1(string value){part1 = value;}public void BuildPart2(string value){part2 = value;}public void BuildPart3(string value){part3 = value;}public Product GetResult(){return new Product(part1, part2, part3);}
}public class Director
{public Product Construct(IBuilder builder){builder.BuildPart1("Part1");builder.BuildPart2("Part2");builder.BuildPart3("Part3");return builder.GetResult();}
}public class Client
{public void Main(){IBuilder builder = new ConcreteBuilder();Director director = new Director();Product product = director.Construct(builder);}
}

在这里插入图片描述

总结

创建型模式是软件设计中的重要概念,可以帮助我们更好地组织和管理对象的创建过程。本篇文章介绍了C#中常见的创建型模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、原型模式和建造者模式。通过熟悉和灵活应用这些模式,我们可以写出更加可维护、可扩展和可测试的代码。

参考文献:

  • Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

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

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

相关文章

JavaScript中数据类型的转换

前端面试大全JavaScript中数据类型的转换 🌟经典真题 🌟数据类型转换介绍 🌟强制转换(显式转换) Number( ) String( ) Boolean( ) 🌟自动转换(隐式转换) 自动转换为布尔值 …

基于SpringBoot房产销售系统

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不断成熟,带动了房产销售系统,它彻底改变了过去传统的…

Go 中切片(Slice)的长度与容量

切片长度与容量在 Go 中很常见。切片长度是切片中可用元素的数量,而切片容量是从切片中第一个元素开始计算的底层数组中的元素数量。 Go 中的开发者经常混淆切片长度和容量,或者对它们不够了解。理解这两个概念对于高效处理切片的核心操作,比…

Linux C/C++高级全栈开发(后端/游戏/嵌入式/高性能网络/存储/基础架构)

Linux C/C高级全栈开发是一个涉及到多个领域的综合性技术要求,需要对Linux系统、C/C编程语言以及各种相关的技术进行深入的理解和应用。 下面是一些涵盖的主要技术领域和技能要点: Linux系统基础:熟悉Linux操作系统的原理和常用命令&#xf…

AIGC 3D即将爆发,混合显示成为产业数字化的生产力平台

2023年,大语言模型与生成式AI浪潮席卷全球,以文字和2D图像生成为代表的AIGC正在全面刷新产业数字化。而容易为市场所忽略的是,3D图像生成正在成为下一个AIGC风口,AIGC 3D宇宙即将爆发。所谓AIGC 3D宇宙,即由文本生成3D…

pulseaudio是如何测试出音频延迟的

通常专业的音频设备生产厂商都有专业的设备来测试精确的音频链路延时。 那么没有专业设备怎么测试出音频延迟呢?如下图,我们可以看到pulseaudio可以测试出硬件音频延迟。 那么,他是怎么测试出硬件延迟的呢?他的理论依据是什么呢?接下来我带大伙一起探索一下。 /*占位…

使用new Vue()的时候发生了什么?

前言 Vue.js是一个流行的JavaScript前端框架,用于构建单页面应用(SPA)和用户界面。当我们使用new Vue()来创建一个Vue实例时,Vue会执行一系列的初始化过程,将数据变成响应式,编译模板,挂载实例…

【vue实战项目】通用管理系统:信息列表,信息录入

本文为博主的vue实战小项目系列中的第六篇,很适合后端或者才入门的小伙伴看,一个前端项目从0到1的保姆级教学。前面的内容: 【vue实战项目】通用管理系统:登录页-CSDN博客 【vue实战项目】通用管理系统:封装token操作…

Swagger在php和java项目中的应用

Swagger在php和java项目中的应用 Swagger简介Swagger在java项目中的应用步骤常用注解 Swagger在php项目中的应用 Swagger简介 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 总体目标是使客户端和文件系统作为服务器以…

分治法之归并排序

思路: 将待排序数组分成两个子数组,计算中间位置mid。对左半部分进行递归排序,得到一个有序的子数组。对右半部分进行递归排序,得到另一个有序的子数组。合并两个有序的子数组,得到一个完整的有序数组。 示例图: 代码: #include&…

关于微服务的思考

目录 什么是微服务 定义 特点 利弊 引入时机 需要哪些治理环节 从单体架构到微服务架构的演进 单体架构 集群和垂直化 SOA 微服务架构 如何实现微服务架构 服务拆分 主流微服务解决方案 基础设施 下一代微服务架构Service Mesh 什么是Service Mesh&#xff1f…

金石工程项目管理系统 SQL注入漏洞复现

0x01 产品简介 金石工程项目管理软件是一款工程项目管理软件,专门针对建筑工程项目开发,可以用于各种工地的项目管理。 0x02 漏洞概述 金石工程项目管理系统TianBaoJiLu.aspx接口处存在SQL注入漏洞,攻击者可通过该漏洞获取数据库中的信息(例如&#xff…

HCIA-RS基础-RIP路由协议

前言: RIP路由协议是一种常用的距离矢量路由协议,广泛应用于小规模网络中。本文将详细介绍RIP路由协议的两个版本:RIPv1和RIPv2,并介绍RIP的常用配置命令。通过学习本文,您将能够掌握RIP协议的基本原理、RIPv1和RIPv2的…

SpringBoot-监听Nacos动态修改日志级别

目录 一、pom文件 二、项目配置文件 三、日志配置文件 四、日志监听类 五、日志动态修改服务类 线上系统的日志级别一般都是 INFO 级别,有时候需要查看 WARN 级别的日志,所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心&#xff0c…

面试:SpringMVC问题

文章目录 SpringMVC运行流程MVC的概念与请求在MVC中的执行路径,ResponsBody注解的用途SpringMVC启动流程SpringMVC的拦截器和过滤器有什么区别?执行顺序?Spring和SpringMVC为什么需要父子容器? SpringMVC运行流程 • 客户端&#…

C#工程中Form_xx.cs不能在设计器中查看

环境:VS2022 直接上图: 原因: 写了个类在Form_xx.cs中从For继承的部分类之前,移动到之后,保证窗体类是代码中的首个类即可,如图:

前端编码技巧须知

前端开发中可能会使用到以下软件,它们各自具有不同的作用: 代码编辑器:例如Sublime Text、Atom、Visual Studio Code等,用于编写和编辑HTML、CSS和JavaScript等前端代码。网页浏览器:例如Chrome、Firefox、Safari等&a…

PyQt6运行QTDesigner生成的ui文件程序

2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计18条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~、第2讲 PyQt6库和工具库Q…

【合集】MQ消息队列——Message Queue消息队列的合集文章 RabbitMQ入门到使用

前言 RabbitMQ作为一款常用的消息中间件,在微服务项目中得到大量应用,其本身是微服务中的重点和难点。本篇博客是Message Queue相关的学习博客文章的合集篇,目前主要是RabbitMQ入门到使用文章,后续会扩展其他MQ。 目录 前言一、R…

Redis大key与热Key

什么是 bigkey? 简单来说,如果一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey。具体多大才算大呢?有一个不是特别精确的参考标准: bigkey 是怎么产生的?有什么危害?…