工厂模式三部曲之一_简单工厂模式
这段时间想要好好了解下工厂模式,从而在园中看了很多博友的关于工厂模式的博客, 受益匪浅......同时也感谢各位博友对知识的无私的分享....知识在于积累,但个人觉得积累知识的最好方式是当自己学懂了某个知识点之后,进行一番总结,将学到的东西再慢慢的推理一遍,再细细的消化一遍,进而转变为自己的东西.......
简单工厂模式
【解决问题】:如何去实例化一个合适的对象
【核心思想】:有一个专门的类类负责创建实例的过程 并返回给实例的对象
【角 色】
工厂类角色:担任这个角色的简单工厂模式的核心,工厂类在客户端的直接调用下 创建产品对象并返回该对象。
抽象产品角色:担任这个角色的类是工厂类所创建的对象的父类,或者他们有共同的接口。
具体产品角色:工厂类所创建的任何对象都是这个角色的实例
下面介绍一个例子来进行讲解
首先了解下现实场景:一个人总有很多件不同类型的衣服来适应不同的场合,怎么样用程序来实现呢??
对该场景进行分析:
抽象产品:衣服具有一些共同的特征,或者定义公共方法或者属性,放在此类中-----abstract:GetCloth()抽象方法
具体产品:衣服 继承与接口或者抽象 同时具有自身的特点
接下来贴上代码:
抽象产品类:定义了一个公共的方法GetCloth(),用来获取对应的衣服
2 public abstract class Cloth
3 {
4 public abstract void GetCloth();
5 }
具体产品类:定义了三种具体的产品:商务装、休闲装、运动装,都继承于抽象产品类,重写了抽象产品类中的抽象方法
2 class 商务装 : Cloth
3 {
4 public override void GetCloth()
5 {
6 Console.WriteLine("商务装......");
7 }
8 }
9
10 //具体产品2:运动装
11 class 运动装 : Cloth
12 {
13 public override void GetCloth()
14 {
15 Console.WriteLine("运动装.....");
16 }
17 }
18
19 //具体产品3:休闲装
20 class 休闲装 : Cloth
21 {
22 public override void GetCloth()
23 {
24 Console.WriteLine("休闲装.......");
25 }
26 }
工厂类(核心):根据客户端传入的参数来实例化对应类的对象 并返回该对象给客户端(这里的参数为服装类型拼音的小写首字母),定义了一个CreateCloth()方法----当然,这里的类型必须是已知的,也可以将类型放置于配置文件中来进行扩展,,便于类型的添加和修改........
2 public class ClothFactory
3 {
4
5 public static Cloth CreateCloth(string clothtype)
6 {
7 Cloth cloth = null;
8 switch(clothtype)
9 {
10 case "sw":
11 cloth = new 商务装();
12 break;
13 case "yd":
14 cloth = new 运动装();
15 break;
16 case "xx":
17 cloth = new 休闲装();
18 break;
19 default:
20 cloth = null;
21 break;
22 }
23 return cloth;
24 }
客户端:调用工厂类的静态方法,传入合适的参数获取对应对象
2 static void Main(string[] args)
3 {
4 //要求商务装
5 Cloth cloth = ClothFactory.CreateCloth("sw");
6 cloth.GetCloth();
7
8 //要求运动装
9 Cloth clothsport = ClothFactory.CreateCloth("yd");
10 clothsport.GetCloth();
11
12 Console.ReadKey();
13 }
总结优缺点:
优点:用户在使用时是根据工厂类去创建所需的对象实例,而无需了解是如何创建和组织这种细节问题,有利于软件体系结构的优化
缺点:1.创建和不同实例对象的操作都在一个类中完成,即不符合单一职责的原则
2.当需要添加或者删除某个功能是会比较麻烦,需要修改工厂类,违背了开放-封闭的原则(对修改封闭,对扩展开放)
3.工厂类中的方法为static静态方法(静态工厂方法),不能通过继承来改变创建行为
嘿嘿,既然是工厂模式三部曲...当然还有后续的工厂模式和抽象工厂模式了..........敬请关注.............
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述