打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶

为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式

我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细

通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕

同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用。

试想我们遇到以下情景,我们该怎么处理

在工作中,我们需要处理不同类型的文件,有音频的,视频的,图片的,文本的。通过程序的处理,我们可以分别提取到不同的信息。

这种情况你准备怎么处理

工作经验少的同学默默的心理噗嗤一声,看我5分钟搞定

class Program { static void Main() { var fileType = 'Video'; switch (fileType) { case 'Video': HandleVideoFile(fileType); break; case 'Audio': HandleAudioFile(fileType); break; case 'Image': HandleImageFile(fileType); break; case 'Text': HandleTextFile(fileType); break; } Console.ReadKey(); } public static void HandleTextFile(string fileType) { Console.WriteLine('我开始处理文本文件了'); } public static void HandleImageFile(string fileType) { Console.WriteLine('我开始处理图片文件了'); } public static void HandleAudioFile(string fileType) { Console.WriteLine('我开始处理音频文件了'); } public static void HandleVideoFile(string fileType) { Console.WriteLine('我开始处理视频文件了'); } }
View Code

各个方法封装,独立,可随处调用,面向对象三大特性,简简单单随随便便给你展现一脸

后来,系统变强壮了,业务增加了,要求同时也能处理邮件Email

是不是你这个时候开始修改代码,增加一个方法,添加一个case,break;

如果后续陆陆续续好几十种继续增加,怎么办。程序的可维护性,可扩展性在哪里?

开放-封闭原则在哪里?

开放-封闭原则是只软件实体(类,模块,函数等等),应该可以扩展,但是不可修改

抛开所有原则,再增加5个,你这个类的代码得有1000行了吧,那么多case,break, 那天稍微不小心的改错一个,是不是会引起巨震。

所以,我们开始进行修改,也就是我们接下来进入正题的 简单工厂模式。

所谓的简单工厂模式,是将一个具体类的实例化交给一个工厂方法来执行

1个点,敲黑板,重点来了

工厂方法来执行。首先需要一个工厂,还需要一个方法。一个方法来干嘛?来实例化具体的类,具体的什么类?具体的算法类!

我们首先来定义一个抽象类

public abstract class Handle { public abstract void HandleFile(); }
View Code

这个类告诉全世界,要实现我,就得实现我的方法,我们是强关系,我们是合成关系,我们是拥有关系,我们是鸟儿与翅膀的关系!

而且不准实现我,要实现,先继承,要继承,就得override我的所有方法

于是,不得已,要处理的类纷纷开始实现

文件处理类

/// <summary> /// 文本处理类 /// </summary> public class TextHandle : Handle { public override void HandleFile() { Console.WriteLine('我开始处理文本文件了'); } }
View Code

图片处理类

/// <summary> /// 图片处理类 /// </summary> public class ImageHandle : Handle { public override void HandleFile() { Console.WriteLine('我开始处理图片文件了'); } }
View Code

视频处理类

/// <summary> /// 视频处理类 /// </summary> public class VideoHandle : Handle { public override void HandleFile() { Console.WriteLine('我开始处理视频文件了'); } }
View Code

音频处理类

/// <summary> /// 音频处理类 /// </summary> public class AudioHandle : Handle { public override void HandleFile() { Console.WriteLine('我开始处理音频文件了'); } }
View Code

所有的处理类我们定义好了,如果后续,业务变更,需求增加,再添加什么邮件啊,电话啊,其他什么的,我们只需要继续添加我们的类,而不是通过去添加方法,这样每个类的单一职责原则是不是体现的很淋漓尽致了,如果单一职责觉得太书面,我们换个称呼,单一功能原则!没法再简单了

所有的处理类已经Ready了,我们的重点工厂可以开始修建了

public class HandleFactory { public Handle CreateHandle(string fileType) { Handle handle = null; switch (fileType) { case 'Video': handle = new VideoHandle(); break; case 'Audio': handle = new AudioHandle(); break; case 'Image': handle = new ImageHandle(); break; case 'Text': handle = new TextHandle(); break; } return handle; } }
View Code

不要指指点点,不要指指点点,不要指指点点

我们就像项目过程一样,渐进明细

这次介绍的是简单工厂模式,简单工厂重点是 简单,工厂

后续增加业务的时候,我们只需要再加case,和对应的Handle类就好了

如何调用呢

class Program { static void Main() { var handleFactory = new HandleFactory(); var fileType = 'Text'; var handle = handleFactory.CreateHandle(fileType); handle.HandleFile(); } }
View Code

是不是一下简单明了,你要是Web程序,可以,要是CS程序,可以,要是WebAPI,也可以

易扩展,可维护

 

总结下

优点

1、扩展性高,如果想增加一个处理方式,只要扩展一个处理类就可以。

2、屏蔽实现,只关心处理的结果

3、带你走进工厂模式

缺点

1、每次增加一个处理对象的时候,都需要增加一个处理类,还要同时告诉工厂,增加处理类型

2、增加了系统具体类的依赖

 

以上就是关于简单工厂模式的分享

一路前行,风雨无阻,不定时更新

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
工厂方法模式(Factory Method Pattern)
博客园 - 探索设计模式(七):创建型模式专题总结(Creational Pattern)
C#设计模式(4)-Simple Factory Pattern 吕
简单工厂,工厂方法和抽象工厂的区别
Spring.NET教程(五)
面向对象23种设计模式系列(一)- 创建型设计模式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服