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.mzph.cn/news/173768.shtml

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

相关文章

数据结构与算法编程题26

计算二叉树深度 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode* lchild, * rchild; }BiTNo…

传音荣获2023首届全国人工智能应用场景创新挑战赛“智能家居专项赛”三等奖

近日&#xff0c;中国人工智能学会与科技部新一代人工智能发展研究中心联合举办2023首届全国人工智能应用场景创新挑战赛&#xff08;2023 1st China’s Innovation Challenge on Artificial Intelligence Application Scene&#xff0c;以下简称CICAS 2023)&#xff0c;吸引了…

供配电系统智能化监控

供配电系统智能化监控是指利用先进的监测技术、自动化控制技术、计算机网络技术等&#xff0c;对供配电系统进行实时、全方位的监测和控制&#xff0c;以实现供配电系统的安全、稳定、高效运行。 供配电系统智能化监控的主要功能包括&#xff1a; 实时数据采集&#xff1a;通过…

Cpython编译后再使用Pyinstaller打包

一、Cpython Python是一门解释型语言&#xff0c;当我们想让其他人运行我们的代码时&#xff0c;如果直接将.py源代码发送给他人&#xff0c;那么源代码将没有任何安全性可言&#xff0c;也就是任何一个人都可以打开源代码一看究竟&#xff0c;任何人都可以随意修改源代码。 …

Linux(CentOS7.5):新增硬盘分区纪实

一、服务器概述 1、既有一块系统硬盘&#xff0c;新增一块100G硬盘。 2、要求&#xff0c;将新插入硬盘分为&#xff1a;20G、30G、50G。 二、操作步骤 1、确认新硬盘是否插入成功&#xff1a; fdisk -l# 红色框出来的&#xff0c;为识别出来的新硬盘信息 # 黄色框出来的&#…

idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;jdk17安装全方位手把手安装教程 / 已有jdk8了&#xff0c;安装JDK17后如何配置环境变量 / 多个不同版本的JDK&#xff0c;如何配置环境变量&a…

【开源】基于Vue.js的高校大学生创业管理系统的设计和实现

项目编号&#xff1a; S 027 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S027&#xff0c;文末获取源码。} 项目编号&#xff1a;S027&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创…

直播预告 | AR眼镜在现代医疗中究竟有哪些妙用?11.28晚八点虹科直播间为您揭晓!

直播预告 | AR眼镜在现代医疗中究竟有哪些妙用&#xff1f;11.28晚八点虹科直播间为您揭晓&#xff01; 什么是AR眼镜&#xff1f; AR眼镜&#xff0c;即增强现实眼镜&#xff0c;是一种结合虚拟信息与真实世界的创新医疗工具。 通过集成高科技传感器和实时数据处理技术&…

【Python】使用globals()函数成功解决tkinter多个新窗口问题

我在近期的一个项目&#xff08;tkinter复刻记事本&#xff09;上遇到一个很有意思的问题&#xff1a;如何在创建多个新窗口后&#xff0c;每个窗口还能独立运行&#xff1f;当时我尝试几种方法&#xff0c;奈何实力不足&#xff0c;于是便下定结论非使用线程不可&#xff0c;至…

通付盾Web3专题 | SharkTeam:起底朝鲜APT组织Lazarus Group,攻击手法及洗钱模式

国家级APT&#xff08;Advanced Persistent Threat&#xff0c;高级持续性威胁&#xff09;组织是有国家背景支持的顶尖黑客团伙&#xff0c;专门针对特定目标进行长期的持续性网络攻击。朝鲜APT组织Lazarus Group就是非常活跃的一个APT团伙&#xff0c;其攻击目的主要以窃取资…

JavaScript WebApi(二) 详解

监听事件 介绍 事件监听是一种用于在特定条件下执行代码的编程技术。在Web开发中&#xff0c;事件监听器可以用于捕获和响应用户与页面交互的各种操作&#xff0c;如点击、滚动、输入等。 事件监听的基本原理是&#xff0c;通过在特定元素上注册事件监听器&#xff0c;当事件…

免费SSL证书有效期只有90天?太短?

随着网络安全问题日益受到重视&#xff0c;SSL证书成为了网站安全的必需品。然而&#xff0c;在许多情况下&#xff0c;免费提供的SSL证书往往只有90天的有效期&#xff0c;这种期限对于很多用户来说显得过于短暂。 首先&#xff0c;我们要理解为什么 SSL 证书的有效期设定为90…

基于单片机DHT11湿度测量与控制-CO2-光照报警系统程序和仿真

一、系统方案 1、本设计采用这51单片机作为主控器。 2、DHT11温湿度、CO2、光照强度送到液晶1602显示。 3、按键设置报警值。 4、蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 //初始化LCD*********************************…

LCR 047. 二叉树剪枝 和 leetCode 1110. 删点成林 + 递归 + 图解

给定一个二叉树 根节点 root &#xff0c;树的每个节点的值要么是 0&#xff0c;要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。节点 node 的子树为 node 本身&#xff0c;以及所有 node 的后代。 示例 1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1] 解释: 只有红…

Nvidia VPI 双目相机生成深度图

nVidia VPI&#xff08;Vision Programming Interface&#xff09;提供了多种后端&#xff0c;用于执行图像处理和计算机视觉操作。不同的后端针对不同的硬件和用例进行了优化。这些后端包括&#xff1a; 1. CPU: 这是最通用的后端&#xff0c;它运行在标准的中央处理器&#…

【深度学习笔记】04 概率论基础

04 概率论基础 概率论公理联合概率条件概率贝叶斯定理边际化独立性期望和方差模拟投掷骰子的概率随投掷次数增加的变化 概率论公理 概率&#xff08;probability&#xff09;可以被认为是将集合映射到真实值的函数。 在给定的样本空间 S \mathcal{S} S中&#xff0c;事件 A \m…

Intellij Idea 断点小圆变成灰色怎么处理

场景1&#xff1a;变成了灰色实心圆 原因 断点变成灰色通常表示该断点处于失效状态。这可能是由于无意中点击了debug调试下方的“mute breakpoints”按钮导致的。 解决方案 依次点击设置小图标->View Options->Mute BreakPoints. 点击后 Mute BrakPoints左侧显示✔ 符号…

python之pyqt专栏5-信号与槽1

在上一篇文章&#xff0c;我们了解到如果想要用代码改变QLabel的文本内容&#xff0c;可以调用QLabel类的text()函数。 但是现在有个这样的需求&#xff0c;界面中有一个Button与一个Label&#xff0c;当点击Button时&#xff0c;将Label的内容改变为“Hello world&#xff01;…

【兔子王赠书第9期】ChatGPT进阶:提示工程入门

文章目录 写在前面ChatGPT推荐图书关键点编辑推荐内容简介推荐理由 粉丝福利写在后面 写在前面 人类一直在寻找、制造并使用工具&#xff0c;以扩展我们的能力&#xff0c;适应我们的环境&#xff0c;甚至超越我们的生物限制。现在&#xff0c;我们正站在一个历史性的分水岭之…

Jetpack Compose中适应性布局的新API

Jetpack Compose中适应性布局的新API 针对大屏幕优化的新组合件。 使用新的Material适应性布局&#xff0c;为手机、可折叠设备和平板电脑构建应用程序变得更加简单&#xff01;市场上各种不同尺寸的Android设备的存在挑战了构建应用程序时对屏幕尺寸的通常假设。开发者不应该…