Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】

这篇具有很好参考价值的文章主要介绍了Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 〇、简介

1、什么是简单工厂模式?

一句话解释:

  客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。

简单工厂模式(Simple Factory Pattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需要知道对象的实现细节。工厂类负责创建对象的整个生命周期,并且负责处理与具体实现有关的逻辑。

这种将变化逻辑和客户端分离的方式,就是面向对象中的“封装”特性了。

 一个比喻:(食堂与学生)

  比如一个食堂中午有各种面食,学生也就是客户端,关心的是菜单想吃哪个就给直接说,不关心这份焖面或者烩面怎么做的,后厨就相当于工厂类,把控着制作的步骤。

2、优缺点和使用场景

  • 优点:简单工厂模式可以使客户端代码变得简洁,同时隐藏对象的实现细节。
  • 缺点:当需要增加新的运算类时,需要修改工厂类的代码,这违反了开闭原则。此外,工厂类包含了一组相关对象的创建逻辑,这使得工厂类变得复杂,难以维护。

 使用场景举例:

  • 客户端如果对于如何创建对象的逻辑不关心,且知道工厂类的入参时,可以考虑使用简单工厂模式。
  • 当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式,因为比较多的话 case 太多维护起来较麻烦。

二、简单工厂模式的简单实现与比较

 如下代码,是一个画形状的示例:

// 形状接口,画动作的方法
public interface IShape
{
    void Draw();
}
public class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("画圆:〇");
    }
}
public class Rectangle : IShape
{
    public void Draw()
    {
        Console.WriteLine("画方:口");
    }
}
public class ShapeFactory // 简单工厂实现
{
    public static IShape CreateShape(string shapeType)
    {
        switch (shapeType) // 当需要扩展时,就需要修改这里的 case 也是本模式的缺点所在
        {
            case "圆":
                return new Circle();
            case "方":
                return new Rectangle();
            default:
                throw new ArgumentException("输入形状不支持!");
        }
    }
}

测试代码: 

static void Main(string[] args)
{
    // 简单工厂模式写法
    IShape circle = ShapeFactory.CreateShape("圆"); // 把对象的创建交给工厂类
    circle.Draw();
    IShape rectangle = ShapeFactory.CreateShape("方");
    rectangle.Draw();
    // 不用简单工厂模式的写法
    Circle circle = new Circle(); // 单个类实例化,把创建对象的工作放在了客户端
    circle.Draw();
    Rectangle rectangle = new Rectangle();
    rectangle.Draw();
}

结果是相同的:

   Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】

三、在 .NET 框架中的实际应用

 .NET 中 System.Text.Encoding 类就实现了简单工厂模式,该类中的 GetEncoding(int codepage) 就是工厂方法,具体的代码可以通过 ILSpy 反编译工具进行查看,下面就是该方法中的代码:

// System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
// System.Text.Encoding
using System.Globalization;

public static Encoding GetEncoding(int codepage)
{
    Encoding encoding = FilterDisallowedEncodings(EncodingProvider.GetEncodingFromProvider(codepage));
    if (encoding != null)
    {
        return encoding;
    }
    switch (codepage)
    {
        case 0:
            return Default;
        case 1200:
            return Unicode;
        case 1201:
            return BigEndianUnicode;
        case 12000:
            return UTF32;
        case 12001:
            return BigEndianUTF32;
        case 65001:
            return UTF8;
        case 20127:
            return ASCII;
        case 28591:
            return Latin1;
        case 1:
        case 2:
        case 3:
        case 42:
            throw new ArgumentException(SR.Format(SR.Argument_CodepageNotSupported, codepage), "codepage");
        case 65000:
            {
                if (LocalAppContextSwitches.EnableUnsafeUTF7Encoding)
                {
                    return UTF7;
                }
                string p = string.Format(CultureInfo.InvariantCulture, "https://aka.ms/dotnet-warnings/{0}", "SYSLIB0001");
                string message = SR.Format(SR.Encoding_UTF7_Disabled, p);
                throw new NotSupportedException(message);
            }
        default:
            if (codepage < 0 || codepage > 65535)
            {
                throw new ArgumentOutOfRangeException("codepage", SR.Format(SR.ArgumentOutOfRange_Range, 0, 65535));
            }
            throw new NotSupportedException(SR.Format(SR.NotSupported_NoCodepageData, codepage));
    }
}

public abstract class Encoding : ICloneable
{
    // 。。。
}

 由源码可知,GetEncoding(int) 方法中,例举了全部可用的编码方式,客户端这可以通过编码 codepage 查询目标编码类型。

参考:https://www.cnblogs.com/zhili/p/SimpleFactory.html

四、简单工厂、工厂方法和抽象工厂模式的关系

三者都属于创建型设计模式,都关注对象的创建,但在实现方式和应用场景上有一些区别。

相同点:

  • 都是创建对象的设计模式,将对象的实例化过程封装起来。
  • 通过使用这些模式,可以提供灵活性和可维护性,降低了代码的耦合度。

区别:

  • 简单工厂(Simple Factory):由一个工厂类根据传入的参数来决定创建哪种产品的实例。客户端只需要与工厂类交互,不需要直接实例化具体产品。适用于创建单一类型的产品。优点是简单易懂,适用于只有少量产品的情况,但缺点是扩展性较差,添加新产品时需要修改工厂类。
  • 工厂方法(Factory Method):定义一个创建产品的接口,由子类来决定具体实例化哪个产品。客户端通过调用工厂方法来获取产品实例。适用于创建一组相关或相似的产品。它通过使用继承或实现接口的方式来实现产品的创建,提供了更好的扩展性和灵活性,但也增加了代码的复杂度。
  • 抽象工厂(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定其具体类。客户端通过调用抽象工厂接口来创建一组相关的产品。适用于创建一系列相关的产品族。它在工厂模式的基础上进一步抽象,将一系列相关的产品组成一个产品族,能够方便地创建一组相关对象。同样也增加了系统的复杂度。

简单工厂模式适用于只有少量产品且不经常变动的情况,而工厂方法模式和抽象工厂模式适用于需要创建多个相关或相似产品的情况。文章来源地址https://www.toymoban.com/news/detail-460078.html

到了这里,关于Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java设计模式-简单工厂(Simple Factory)模式

    简单工厂(Simple Factory)模式,又称为静态工厂方法(Static Factory Method)模式。 由一个工厂类来创建具体产品,即创建具体类的实例。 简单工厂模式从概念上涉及三个角色: 抽象产品角色:是具体类的父类,规定了所有类的共同行为。一般是抽象类、或者接口。 具体产品角

    2024年02月16日
    浏览(15)
  • 设计模式-抽象工厂模式(Abstract Factory Pattern)结构|原理|优缺点|场景|示例

     目录         设计模式(分类)        设计模式(六大原则)        创建型         工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式      结构型         适配器模式        装饰器模式      

    2024年04月22日
    浏览(12)
  • 设计模式--工厂模式(Factory Pattern)

    设计模式--工厂模式(Factory Pattern)

    工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象,而无需暴露对象的实例化逻辑。 工厂模式的主要目标是解耦对象的创建和使用,以及

    2024年02月10日
    浏览(12)
  • 工厂方法模式【Factory Method Pattern】

    工厂方法模式【Factory Method Pattern】

    实例化对象,用工厂方法代替new操作(重点) 工厂模式包括工厂方法模式和抽象工厂模式 抽象工厂模式是工厂方法模式的扩展 有一组类似的 对象需要创建 在编码时 不能预见需要创建哪种类的实例 系统需要考虑 扩展性 ,不应依赖于产品类实例如果被创建、组合和表达的细节

    2024年02月12日
    浏览(10)
  • 抽象工厂模式-Abstract Factory Pattern

    抽象工厂模式-Abstract Factory Pattern

    原文地址:https://jaune162.blog/design-pattern/abstract-factory-pattern/ 首先我们由一个实际问题来引出抽象工厂模式。 考虑这样一个场景,系统中需要向OSS上传文件,以及通过OSS下载文件。而在系统中有不同的业务在使用这两个功能。如下图: 伪代码如下

    2024年02月20日
    浏览(9)
  • 抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern)

    回顾工厂方法设计模式的不足:具体产品增加时,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度 产品等级结构:产品等级结构即产品的继承结构,即抽象产品与具体产品 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构

    2024年02月02日
    浏览(9)
  • 设计模式——抽象工厂模式(Abstract Factory Pattern)

    设计模式——抽象工厂模式(Abstract Factory Pattern)

    概述        抽象工厂模式的基本思想是将一些相关的产品组成一个“产品族”,由同一个工厂统一生产。在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个或者一组重载的工

    2024年02月03日
    浏览(16)
  • 【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )_工厂方法模式的优缺点_韩曙亮的博客-CSDN博客

    2024年02月16日
    浏览(12)
  • 设计模式01———简单工厂模式 c#

    设计模式01———简单工厂模式 c#

    首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务:使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】 首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名为

    2024年02月07日
    浏览(8)
  • C#设计模式教程(1):简单工厂模式

    在C#中,工厂模式可以分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 简单工厂模式(Simple Factory Pattern): 简单工厂模式并不属于23种经典设计模式之一,但它是工厂模式的一种简单形式。 在简单工厂模式中,有一个工厂类负责根据传入的参数决定创建

    2024年01月22日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包