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

news2024/11/25 20:46:18

引言

在软件开发过程中,设计模式是一种被广泛采用的思想和实践,可以提供一种标准化的解决方案,以解决特定问题。设计模式分为三种类型:创建型模式、结构型模式和行为型模式。本篇文章将重点介绍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.coloradmin.cn/o/1260249.html

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

相关文章

python实现自动刷平台学时

背景 前一阵子有个朋友让我帮给小忙,因为他每学期都要看视频刷学时,一门平均需要刷500分钟,一学期有3-4门需要刷的。 如果是手动刷的话,比较麻烦,能否帮他做成自动化的。搞成功的话请我吃饭。为了这顿饭,咱…

Elasticsearch:什么是非结构化数据?

非结构化数据定义 非结构化数据是指未按照设计的模型或结构组织的数据。 非结构化数据通常被归类为定性数据,可以是人类或机器生成的。 非结构化数据是最丰富的可用数据类型,经过分析后,可用于指导业务决策并在许多其他用例中实现业务目标。…

正则表达式和awk

目录 一、正则表达式 1.正则表达式基本介绍 2.正则表达式分类 3.基本正则表达式分类 4.代表字符 5.表示次数 6.位置锚定 7.分组或其他 8.扩展正则表达式 二、awk 1.语法 2.选项 3.基础用法 4.内置变量 5.条件判断 6.数组 总结:本章主要介绍了正则表…

【C++】map与set

​👻内容专栏:C/C编程 🐨本文概括:关联式容器的介绍、set、multiset、map、multimap。 🐼本文作者:阿四啊 🐸发布时间:2023.11.27 一、关联式容器的介绍 在之前C的学习之中&#xf…

STM32入门--看门狗

一、独立看门狗简介 STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看…

【vue】a-table的斑马纹以及hover样式的修改:

文章目录 一、效果:二、实现(以jeecg为例): 一、效果: 二、实现(以jeecg为例): // 设置基数行样式 // .ant-table-tbody tr:nth-child(n) { // color: #fff; // }// hover时候每行…

如何使用 Java 在Excel中创建下拉列表

下拉列表(下拉框)可以确保用户仅从预先给定的选项中进行选择,这样不仅能减少数据输入错误,还能节省时间提高效率。在MS Excel中,我们可以通过 “数据验证” 提供的选项来创建下拉列表,但如果要在Java程序中…

Android应用程序开发实战篇----期末总结1

项目1(了解移动电子商务开发) 1,任务一:了解移动电子商务 移动电子商务:利用无线终端进行的电子商务活动。 移动电子商务的特点:方便,摆脱时空性,安全,潜在用户规模大,…

loadrunner-关联

loadrunner-关联 文章目录 关联自动关联手动关联手写脚本,关联登录token 关联 关联的作用是将服务器返回的数据保存为参数,后续接口中会用到该参数,当服务器数据发生变更时,脚本中的参数值也同时进行更新。 当脚本中需要服务器返…

Open Feign 源码解析(二) --- 如何发送http请求

Open Feign 源码解析二 如何发送http请求? 如何组件化? 定义接口 public interface Client {Response execute(Request request, Options options) throws IOException; }是否存在已有的方案? 1)rest template http client o…

5.9每日一题(幂级数求收敛区间:收敛半径不变的定理)

幂级数逐项求导逐项求积分(乘n或者除n),收敛半径不变 幂级数x换成xx0(即平移),收敛半径不变

手把手教学拥有自己的CLI

随着开发时间的增长,你积累的模版需要管理,不能老是复制粘贴。那么一个小小的cli 可以帮助你这个问题。它是你进行管理分类的管家,替你管理仓库和翻东西。 技术选型 NodeJSTSpnpmunbuild : unbuild 是基于rollup 配置更加单的打包工具chalk :…

【开源】基于Vue.js的无代码动态表单系统的设计和实现

项目编号: S 026 ,文末获取源码。 \color{red}{项目编号:S026,文末获取源码。} 项目编号:S026,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动…

2023-11-27操作系统---进程—线程—实验

目录 2023-11-27操作系统_进程—线程_实验 5-10&#xff1a; 代码&#xff1a; 运行结果: 5-11 代码&#xff1a; 运行结果&#xff1a;​编辑 2023-11-27操作系统实验 5-10&#xff1a; 代码&#xff1a; #include<unistd.h> #include<stdio.h> #include…

力扣hot100 滑动窗口最大值 单调队列

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public int[] maxSlidingWindow(int[] nums, int k){int n nums.length;int[] res new int[n - k 1]; // 单调递减队列int[] q new int[n];// q数组维护的是元素在 nums 数组对应的下标int…

FFmepg 核心开发库及重要数据结构与API

文章目录 前言一、FFmpeg 核心开发库二、FFmpeg 重要数据结构与 API1、简介2、FFmpeg 解码流程①、FFmpeg2.x 解码流程②、FFmpeg4.x 解码流程 3、FFMpeg 中比较重要的函数以及数据结构①、数据结构②、初始化函数③、音视频解码函数④、文件操作⑤、其他函数 三、FFmpeg 流程1…

史上最细,2个半月从功能进阶自动化测试,进阶指南...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、学习自动化之前…

算法通关村第一关|链表基础

1. 单链表概念 对于所有的数据结构的基础都是创建增删改查&#xff0c;学习链表重点也是学习链表的五种基本操作。 单向链表就像一个铁链一样&#xff0c;元素之间相互连接&#xff0c;包含多个结点&#xff0c;每个结点有一个指向后继元素的next指针。表中最后一个元素的nex…

【文献阅读笔记】关于GANomaly的异常检测方法

文章目录 1、GANomaly: Semi-Supervised Anomaly Detection via Adversarial Training模型主要创新 2、Skip-GANomaly: Skip Connected and AdversariallyTrained Encoder-Decoder Anomaly Detection模型主要创新点 3、Industrial surface defect detection and localization u…

AMP State Evolution的计算:以伯努利高斯先验为例

AMP State Evolution (SE)的计算 t 1 t1 t1时&#xff0c; E ( t ) E [ X 2 ] \mathcal E^{(t)} \mathbb E [X^2] E(t)E[X2]&#xff0c;SE的迭代式为 τ r ( t ) σ 2 1 δ E ( t ) E ( t 1 ) E ∣ η ( t ) ( X Z ) − X ∣ 2 , Z ∼ N ( 0 , τ r ( t ) ) \begin{a…