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();
}
结果是相同的:

三、在 .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 Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】的更多相关文章
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- OOAD-设计模式(三)之创建型设计模式(5种)
前言 前面介绍了OOAD的基础知识,现在我们来详细的说明一下GOF设计模式中的23种模式,希望大家能够学到东西! 一.工厂方法模式(Factory Method) 1.1.工厂方法模式概述 工厂方法模 ...
- 设计模式3---工厂模式(Factory Pattern简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- 4.Factory Pattern(工厂模式)
工厂模式(Factory Pattern)定义: 定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. 针对实现编程,但是当我们每次使用new时候,不正是在针对 ...
- C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...
- C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
- 设计模式之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式的由来 所有设计模式都是为解决某类问题而产生的,那么简单工厂模式是为解决什么问题呢?我们假设有以下业务场景: 在一个学生选课系统中,文科生用户选课时,我们要获得文科生的所有课程列表:理 ...
- C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...
- 设计模式笔记:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式:定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式:只需要一个Factory类. 简单工厂模 ...
随机推荐
- mybatis-plus使用FIND_IN_SET
xxxQueryWrapper.eq("is_deleted","0").apply(deptUser.getDeptId() != null,"de ...
- nat是干什么的,为什么要有nat?以及谈谈ovs里使用ct实现nat功能
博客竟然不显示更新的时间,只有个发布时间.看起来像2个月没更新一样,其实更新了几行呢.好几个东西想理一下,本来想和周记放一起了,但放一起就没有主题了. 当然一搜也有一些很好的博客,更详细:https: ...
- day05-2-yaml
yaml 1.yaml介绍 YAML是 "YAML Ain't a Markup Language" (YAML不是一种标记语言)的递归缩写.在开发这种语言时,YAML的意思其实是 ...
- 纠删码在实时视频流中的应用丨Dev for Dev 专栏
本文为「Dev for Dev 专栏」系列内容,作者为声网网络体验团队王瑞. 01 背景 在实时音视频通话中,音视频质量受网络丢包影响较大,特别是对于视频. 为什么视频对丢包更敏感呢?通常来说,音频的 ...
- Z 函数
简单记一下,避免忘记. z 函数 对于字符串 \(S\),我们将 \(z(i)\) 定义为从 \(i\) 开始的后缀与 \(S\) 的最长公共前缀的长度. \(O(n)\) 求出 z 函数 我们添加一 ...
- 3分钟带你了解Hadoop是什么
Hadoop是一种开源的分布式计算框架,它在Google的MapReduce论文发表后大受欢迎,并被广泛应用.Hadoop框架包括一个分布式文件系统(HDFS),它允许用户以分布式方式存储和管理大量数 ...
- 全局唯一ID的实现方案
为什么需要保证唯一ID? 在单机服务架构中,数据库的每一个业务表的主键ID都是允许自增的,但是在分布式服务架构的分库分表的设计,使得多个库或者多个表存储了相同的业务表,如果没有一个全局的唯一ID设计方 ...
- Windows11快捷键大集合+手动给程序添加快捷键
本文收集了170多个windows11上的快捷键,其中有少部分是windows11新添加的.大部分的win10快捷键也适用于win11.这些快捷键涵盖了系统设置.命令行程序执行.Snap布局切换.对话 ...
- c++与linux详细计划,精确到每一天(仅80天)
好的,以下是三个月中每一天的学习计划: 第一个月: 第1天:阅读C++教程,熟悉环境,了解基本语法和数据类型 第2天:编写Hello World程序,加深对C++环境的了解 第3天:学习函数的定义和调 ...
- 「高频必考」Docker&K8S面试题和答案
先送福利:Go如何自动解压缩包?| 文末送书 Docker 如何在Docker容器内部访问主机上的服务? 可以通过设置主机网络模式,使用--net=host参数来访问主机上的服务.这样,容器和主机将共 ...