**** 前言在讲述之工厂方法模式前,我们来先了解简单工厂模式,简单工
08月28日 22:49
****## 前言
在讲述之工厂方法模式前,我们来先了解简单工厂模式,简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用也较为频繁,同时它也是学习其他创建型模式的基础。下面我们来先了解下简单工厂模式,然后针对它的缺点来引出工厂方法模式。
简单工厂模式简单来说就是创建一个工厂类,通过输入的参数创建对象赋值给基类,完成对想要的派生类的调用,从而达成目标,具体的操作均在子类中完成,工厂类只负责运算逻辑和给基类赋值。在简单工厂模式中,只需要记住一个简单的参数即可获得所需的对象实例,它提供专门的核心工厂类来负责对象的创建,实现对象的创建和使用分离。该模式有三部分:
【资料图】
抽象产品类和工厂类合并,将静态工厂方法移到抽象产品类中,根据不同的参数创建不同类型的产品子类对象。只需要添加配置文件并更改相关参数读取参数即可,不要重新编译程序。
引入NuGet包:System.Configuration.ConfigurationManager
添加配置文件:App.config
文件,追加内容
创建抽象父类和具体子类抽象类:包含工厂方法
/// /// 【01】抽象工厂类 /// public abstract class Product { /// /// 静态工厂方法 /// /// /// public static Product GetProduct(string arg) { Product product = null; switch (arg) { case "A": product = new ProduceA(); break; case "B": product = new ProduceB(); break; //注意:有新产品需要修改工厂方法和创建新具体产品 default: throw new ArgumentException(message: "参数不合法"); } return product; } /// /// 所有产品类的公共业务方法 /// public void MethodSame() { Console.WriteLine("公共业务方法"); } /// /// 声明抽象业务方法 /// public abstract void MethodDiff(); }
具体子类:
/// ///【02】具体工厂类A /// public class ProduceA : Product { /// /// 实现业务方法 /// public override void MethodDiff() { Console.WriteLine("产品A处理业务方法"); } }
/// ///【03】具体工厂类B /// public class ProduceB : Product { /// /// 实现业务方法 /// public override void MethodDiff() { Console.WriteLine("产品B处理业务方法"); } }
调用
/// /// 调用测试方法 /// public void RunTest() { //客户端调用 var type = ConfigurationManager.AppSettings["product"];//根据配置文件中参数,传入工厂方法,决定创建具体Product Product oneProduct = Product.GetProduct(type); oneProduct.MethodSame(); oneProduct.MethodDiff(); }
简单工厂模式中,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化越多,里面的If–Else–也越多,这样就会造成简单工厂的实现逻辑过于复杂。设计模式是遵循一定原则而得来的,比如,我们要怎么增加代码,怎么修改代码,其中一个原则就是OCP原则,中文是【开放关闭原则】,对增加代码开放,对修改代码关闭,所以我们就不能总是这样修改简单工厂里面的方法。
工厂方法模式可以解决简单工厂模式中存在的这个问题,定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
可以看出,在工厂方法模式的结构图有以下角色:
抽象工厂(Creator): 充当抽象工厂角色,定义工厂类所具有的基本的操作,任何具体工厂都必须继承该抽象类。
具体工厂(CreatorA):充当具体工厂角色,该类必须继承抽象工厂角色,实现抽象工厂定义的方法,用来创建具体车。
抽象车(Car):充当抽象车角色,定义车类型所有具有的基本操作,具体车必须继承该抽象类。
具体车(CarA):充当具体车角色,实现抽象车类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。
简单工厂模式的问题是:如果有新的需求,就需要修改工厂类里面创建产品对象实例的那个方法的实现代码,在面向对象设计一个原则就是哪里有变化,我就封装哪里。
抽象汽车类
/// /// 汽车抽象类 /// public abstract class Car { /// /// 开始行驶 /// public abstract void Go(); }
具体汽车类
/// /// ConcreteCar 具体车辆类 /// public class ConcreteCar { /// /// 红旗汽车 /// public class HongQiCar : Car { public override void Go() { Console.WriteLine("红旗汽车开始行驶了!"); } } /// /// 奥迪汽车 /// public class AoDiCar : Car { public override void Go() { Console.WriteLine("奥迪汽车开始行驶了"); } } }
抽象工厂
/// /// 抽象工厂类 /// public abstract class Factory { /// /// 工厂方法 /// /// public abstract Car CreateCar(); }
具体工厂
/// /// ConcreteFactory 具体工厂方法 /// public class ConcreteFactory { /// /// 红旗汽车工厂类 /// public class HongQiCarFactory : Factory { /// /// 负责生产红旗汽车 /// /// public override Car CreateCar() { return new HongQiCar(); } } /// /// 奥迪汽车工厂类 /// public class AoDiCarFactory : Factory { /// /// 负责创建奥迪汽车 /// /// public override Car CreateCar() { return new AoDiCar(); } } }
调用
/// /// 测试方法 /// public void RunTest() { // 初始化创建汽车的两个工厂 Factory hongQiCarFactory = new HongQiCarFactory(); Factory aoDiCarFactory = new AoDiCarFactory(); // 生产一辆红旗汽车 Car hongQi = hongQiCarFactory.CreateCar(); hongQi.Go(); //生产一辆奥迪汽车 Car aoDi = aoDiCarFactory.CreateCar(); aoDi.Go(); }
优点:
缺点:
关键词:
**** 前言在讲述之工厂方法模式前,我们来先了解简单工厂模式,简单工
08月28日 22:49
红网时刻娄底8月24日讯(通讯员刘彬蒋葵)8月22日,涟源市委副书记、市
08月28日 22:47
二手终于出现了,我龙姨首次登台演唱,会和大老师、彭磊怎么碰撞互怼?
08月28日 22:54
【银河证券章俊:“就业”是宏观政策的锚】8月25日至27日,2023亚布力
08月28日 22:48
现在人们的减肥方式多种多样,最常见的就是控制饮食和加强运动锻炼,虽
08月28日 22:56
领导干部廉政约束规定是指对党员领导干部廉政行为规范的要求和制度,是
08月28日 22:57
大家好,我叫时小刻,备受瞩目的2023第二届岳阳市旅游发展大会于8月28
08月28日 22:50
近日日本执意进行核污染水排海引起国内国际多方质疑一听到这个消息不少
08月28日 22:55
新文科建设始于2018年,至今已走过5年历程。当前,一些地方高校在推进
08月28日 22:55
每经AI快讯,太平洋08月28日发布研报称,给予银轮股份(002126 SZ,最
08月28日 22:50
每经AI快讯,有投资者在投资者互动平台提问:董秘您好!日本放射医学综
08月28日 22:45
《自治区质量强区建设实施方案》日前出台,对新疆新时代质量强区建设工
08月28日 22:48
中新经纬8月23日电(付健青)23日24时,国内成品油新一轮调价窗口将开启
08月28日 22:43
每经AI快讯,海天味业(SH603288,收盘价:40 49元)8月22日晚间发布公
08月28日 22:53
0471房产来为大家解答以上的问题。金钱树开花预示死人,金钱树开花这个
08月28日 22:53
每经AI快讯,博菲电气(SZ001255,收盘价:34 76元)8月22日晚间发布公
08月28日 22:43
□刘一昂(吉林大学)“我是不是恋爱脑?”“TA这样对我,是不是一种情
08月28日 22:45
,你们好,今天0471房产来聊聊一篇山瑶族乡,山瑶族乡简述的文章,网友
08月28日 22:45
8月27日,记者从市生态环境局获悉,《重庆市减污降碳协同增效实施方案
08月28日 22:44
“十一”车展以规模大、规格高而著称。图为往届“十一”车展现场。每届
08月28日 22:52
微信聊天记录不慎删除,如何找回?广东佛山南海西樵的李先生(化名)尝
08月28日 22:52
世卫组织:脊灰病毒传播风险仍构成“国际关注的突发公共卫生事件”世界
08月28日 22:51
立中集团:公司获得客户独家供应项目定点:立中集团(300428)公告,公
08月28日 22:49
正文在2023年9月的星空中,双鱼座闪耀着五彩斑斓的光芒,预示着双鱼座
08月28日 22:44
猇亭区面向2023年高校毕业生招聘招聘岗位报名条件:点击查看报名时间+
08月28日 22:48
海曙区“一门好市”夜市活动消费券发放形式夜市活动专属消费券采用线上
08月28日 22:48
《发少稳胆》再次发车,免费送上胜负彩23107期14场焦点赛事赛果精心预
08月28日 22:49
1、南京市溧水区乐遥老年公寓南京市溧水区乐遥老年公寓位于江苏南京溧
08月28日 22:38
新海南客户端、南海网8月27日消息(记者苏靓)海南有多美?近日,来自
08月28日 22:48
新华社首尔8月26日电(记者陆睿周思雨)包括韩国最大在野党共同民主党
08月28日 22:41