首页 > 编程语言 >Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】

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

时间:2023-05-26 17:57:05浏览次数:48  
标签:case return 示例 Simple codepage 工厂 new 设计模式 public

 〇、简介

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();
}

结果是相同的:

   

三、在 .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

标签:case,return,示例,Simple,codepage,工厂,new,设计模式,public
From: https://www.cnblogs.com/czzj/p/SJMSLL_SimpleFactory.html

相关文章

  • SimpleAdmin手摸手教学之:项目架构设计2.1
    一、说明在2.0的架构设计中引用了插件式开发的概念,将功能模块插件化,以实现更清晰的目录结构,更灵活的解决方案,减少代码的臃肿性。随着2.0版本的使用,也随之暴露出一些问题,之前讲究的插件化并没有完全的实现插件化,我理想的插件化应该是需要某个业务或者功能模块,直接引用该项目既可,不......
  • Shopee|Lazada电商平台api接口,接入获取商品评论|根据关键词取商品列表API说明示例
     Shopee和Lazada是东南亚地区广受欢迎的电商平台。它们的模式非常类似,都是以C2C(消费者到消费者)、B2C(企业到消费者)和O2O(线上到线下)为主要销售模式。用户可以在平台上购买商品或者将自己的商品出售给其他用户。这些平台提供了较高的使用便利性,比如支持多种支付方式、商品搜索......
  • 2023CVPR_Learning a Simple Low-light Image Enhancer from Paired Low-light Instan
    一.motivation以前的大多数LIE算法使用单个输入图像和几个手工制作的先验来调整照明。然而,由于单幅图像信息有限,手工先验的适应性较差,这些解决方案往往无法揭示图像细节。二.contribution1.提出一个成对低光图像输入(相同内容,不同的曝光度)2.在输入之前进行了一个去噪操作,再......
  • Java设计模式-策略模式
    简介在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(StrategyPattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。策略模式与其他设计模式有一些......
  • JAVA使用HTTP代码示例
    以下是使用Java发送HTTP请求的示例代码:```javaimportjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.URL;publicclassHttpExample{publicstaticvoidmain(String[]args){try{//创建URL对象URLurl=newU......
  • javascript设计模式-享元
    这是一种优化性能代码的模式,最适合解决因创建大量类似对象而累及性能的问题。对于那些可能一连几天也不会重新加载的大型应用系统非常有用。它用于减少应用程序所需要数量,通过将对象内部划分为内在数据和外在数据两类来实现。管理享元外在数据有许多方法:1、数据库;2、组合模式(利用......
  • 《设计模式之禅》Multition_Pattern--多例模式
    多例模式嘿,咱们书接上回。单例模式就是每次只能有一个实例,那么多例模式就是可以有多个实例对象。那在中国历史上有没有这种事情发生过呢,嘿,你别说,还真有,就出现在明朝,那三国期间的算不算,不算,各自称帝,各有各的地盘,国号不同。大家还记得那首诗《石灰吟》吗?作者是谁?于谦,他是被谁杀死的?明......
  • 设计模式-软件设计原则
    开闭原则定义:一个软件实体如类,模块和函数应该对扩展开放,对修改关闭用抽象构建框架,用实现扩展细节优点:提高软件系统可复用性和可维护性依赖倒置原则定义:高层模块不应该依赖底层模块,二者都应该依赖其抽象抽象不应该依赖细节,细节应该依赖抽象针对接口编程,不要针对实现编程优......
  • Singleton 单例模式简介与 C# 示例【创建型】【设计模式来了】
     〇、简介1、什么是单例模式?一句话解释:  单一的类,只能自己来创建唯一的一个对象。单例模式(SingletonPattern)是日常开发中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时......
  • 普加项目管理中间件示例之一:标准列
    官方提供了一下这些标准的列:列名任务属性描述PlusProject.IDColumnID任务序号。PlusProject.WBSColumnWBSWBS编码。PlusProject.NameColumnName任务名称。PlusProject.DurationColumnDuration工期。PlusProject.StartColumnStart开始日期。PlusProject.FinishColumnFinish完成日期......