最新要闻
- 谷神星一号遥八运载火箭发射成功
- 通用汽车L4自动驾驶,在上海开跑
- watchdog.sys蓝屏怎么解决
- 慕思股份2023年上半年净利润3.56亿元,同比增长15.31%
- 新乡经开区:每周一遍晓村情 情系群众促振兴
- 想“约会”先刷单 警惕“桃色陷阱”
- 菲律宾电子签证系统率先在上海试行
- 风速62米/秒!9号台风“苏拉”巅峰强度或将与“杜苏芮”齐平
- 中国好声音哈林李健(中国好声音哈林)
- 杭州、南京、成都三城四天集中供地,触顶成交地块数量走低
- 菏泽市定陶区仿山镇孙庄村志愿服务队(关于菏泽市定陶区仿山镇孙庄村志愿服务队简述)
- 强降雨东移河南山东等局地有大暴雨 台风月底或影响东南沿海
- 一场2-0,令金球奖之争无悬念!梅西9场11球3助,52球巨星或陪跑
- 湖北仙桃市杀人案 湖北仙桃市
- dnulop是什么轮胎(donlop是什么牌子轮胎?)
- 中科海讯(300810.SZ):1-6月拟计提各项信用减值损失及资产减值准备5189.85万元
手机
国家卫健委:多措并举完善基层医疗服务
武汉职工医保参保缴费凭证怎么查询打印?
- 国家卫健委:多措并举完善基层医疗服务
- 武汉职工医保参保缴费凭证怎么查询打印?
- 超上百个书源!汇集全网小说,各大类型随你看
- 二年级语文生字表下册(语文三年级下册生字)
- 协昌科技:公司功率芯片产品的下游应用主要包括电动车辆、电动工具、消费电子、家用电器等领域
- 跟风唱衰,只会让情况更糟!
家电
【23种设计模式】工厂方法模式(二)
****## 前言
【资料图】
在讲述之工厂方法模式前,我们来先了解简单工厂模式,简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用也较为频繁,同时它也是学习其他创建型模式的基础。下面我们来先了解下简单工厂模式,然后针对它的缺点来引出工厂方法模式。
简单工厂模式定义
简单工厂模式简单来说就是创建一个工厂类,通过输入的参数创建对象赋值给基类,完成对想要的派生类的调用,从而达成目标,具体的操作均在子类中完成,工厂类只负责运算逻辑和给基类赋值。在简单工厂模式中,只需要记住一个简单的参数即可获得所需的对象实例,它提供专门的核心工厂类来负责对象的创建,实现对象的创建和使用分离。该模式有三部分:
- 工厂方法类:实现创建所有实例的选择类型,被外界调用的接口。
- 抽象父类:所要创建的类的基类,描述类所有实例所共有的公共接口(方法),可以是抽象类也可是接口类型(interface),本例是抽象类。
- 具体子类:所有要创建的具体实例对象。
简单工厂模式代码实现
抽象产品类和工厂类合并,将静态工厂方法移到抽象产品类中,根据不同的参数创建不同类型的产品子类对象。只需要添加配置文件并更改相关参数读取参数即可,不要重新编译程序。
引入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(); }
工厂方法模式优缺点
优点:
- 在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的类名。
- 在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
缺点:
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
关键词:
【23种设计模式】工厂方法模式(二)
Linux将执行命令结果输出到文本文件
三部门:延续实施支持居民换购住房有关个人所得税政策
“有机之州·甘孜甄选”有机产品推介会在乡城县举行 现场揽金1.2亿元
储能周动态
感谢上海医生,扎西德勒!上海专家为2000余名果洛州藏族农牧民义诊
1300㎡滑板公园、约3000套租赁房,集商、住、休闲于一体TOD来了!
DK战队连续五年晋级S赛后,EDG被骂上热搜:Scout风评彻底反转?
光大银行发布半年度报告 在服务实体经济中推进高质量发展
环保板块持续拉涨,中兰环保此前涨停
肥城市召开2023年度转业军官公开选岗会
刚刚,周应波公司辟谣!
长春高新上半年营收净利增速跌至个位数,销售费用超17亿元
在缅电诈嫌疑人被押解回国,警惕“电诈2.0版”!
泰安邱家店镇召开全镇重点指标考核工作推进会
业内首款大模型卫士助力企业解决“想用不敢用”难题
中国出版涨停
谷神星一号遥八运载火箭发射成功
闻泰科技(600745.SH):获得政府补助1.75亿元
《流放之路》新手战士职业推荐
通用汽车L4自动驾驶,在上海开跑
红外光谱分析(紫外分析仪)
生活|学习监督员助攻“学渣”高考逆袭 “买情绪价值”主打满足心理需求
多措并举助力企业人才队伍高质量发展
【财经分析】欧元区经济发展前景恶化 两大主要经济体将面临更多麻烦
有用但别期待 Win11原生RAR/Z7Z压缩性能实测:速度实在太慢
韩国将量产中高空侦察无人机
红岭实验小学教师暑期培训,聚焦大单元教学设计培训与共创实践
梅西9场11球!对方主帅:球王名不虚传,祝福他能一路赢下去!
杭州亚运会颁奖物资发布
新疆是个好地方
特斯拉Cybertruck皮卡车预订量已超196万辆:定金都收了14亿
国家卫健委:多措并举完善基层医疗服务
各地各部门多措并举奋力保障秋粮生产
菲律宾环保人士:反对日本强推核污染水排海 不能让海洋成为垃圾场
新手上路注意什么事项(新手上路注意什么)
汾酒召开生产暨安全工作会
荆楚粮油飘香郑州 300余款产品亮相第五届中国粮食交易大会
武汉住房公积金贷款流程
2023成都国际车展比亚迪海豹DMi预售发布会直播时间及入口
姚红良:振动利用工程已实现20个大类108个具体应用
武侠版八方旅人?像素风RPG《逸剑风云决》定档9月15日上线
武汉职工医保参保缴费凭证怎么查询打印?
成本支撑 9月豆油价格或易涨难跌
常州生育参保哪些费用报销不纳入基金支付范围?
谷神星一号遥八运载火箭发射成功
超上百个书源!汇集全网小说,各大类型随你看
宜昌失业保险申领指南2023
2023年贵阳漫展信息汇总(持续更新)
20年期美债标售稳健,美债保持涨势,长债领涨
watchdog.sys蓝屏怎么解决
广西靖西暴雨导致多处内涝停电 经抢修用电已基本恢复
我市失业保险持续为企纾困为民解难
慕思股份2023年上半年净利润3.56亿元,同比增长15.31%
三湘银行时隔两年又收百万罚单,涉及违法违规问题并非首次
促消费更要从大处着眼
新政落地4个月 青岛港支线集装箱量增长超一倍
不良贷款率提升,拨备覆盖率下降,日照银行上半年增收不增利
新乡经开区:每周一遍晓村情 情系群众促振兴
新乡经开区:每周一遍晓村情 情系群众促振兴
牵手13年 渝深班列PLUS版首发
7月份交通运输主要指标均实现增长
为你我平凡之人而写!且看《浙江宣传》怎么说的《岳阳楼记》
二年级语文生字表下册(语文三年级下册生字)
《匹诺曹的谎言》曝实机演示 展示战斗、探索和Boss
科学育儿 助力成长 百丈半山婴幼儿成长驿站举办科学喂养主题培训课
想“约会”先刷单 警惕“桃色陷阱”
苹果之后,国内首款空间交互AR产品来了!
定位烫与纹理烫(定位烫和纹理烫的区别)
日本东京电力公司公布第一批核污染水排放计划
中央气象台8月27日10时继续发布暴雨黄色预警
北京首钢男篮获“强援” 新赛季渴望创佳绩
菲律宾电子签证系统率先在上海试行
莫言说:“不管你多么善良,当你没价值时,就算你温柔的像只猫,别人都嫌你掉毛。人性都是很恶心的
济郑高铁山东段牵引站全部带电运行
4家上市公司股票遭重要股东减持,三维天地减持金额最高
集安组织今年战略军演将于9月1日在白俄举行
改变人生,从重塑思维开始
华裔女房东惨遭租客锤杀,年幼儿女亦被打成重伤,情况危殆
共建幸福长江 长江流域省级河湖长联席会议举行
测绘地理信息数据将安全有序开放
《封神第一部》破24亿!新概念图哪吒杨戬大战魔礼红
港股银行股逆势上涨,交通银行涨超2%,恒生高股息ETF(513690)溢价交易丨ETF观察
大豆:9月行情或先稳后跌
协昌科技:公司功率芯片产品的下游应用主要包括电动车辆、电动工具、消费电子、家用电器等领域
跟风唱衰,只会让情况更糟!
友邦人寿上半年新业务价值同比增长14% 区域拓展持续深入推进
罕见!敲钟前被叫停IPO 二度上会又被取消审核 这家公司怎么了?
舍得酒业经销商大换血,每月平均退44家!回购计划能否挽回低迷股价?
视频 | 凌晨外卖小哥再出手!协同辅警勇救跳河女子
iPhone 15系列将采用更紧凑内部硬件设计 卡槽和尾插一体化
嘉定如何推动经济社会高质量发展,今天的发布会还透露了这些信息……
做强“四个能级”做好“四个结合” 上海嘉定抢抓汽车产业“新四化”转型机遇
被来分期起诉后会无法进行还款-
考吧天空网怎么样(考吧天空)
班凯罗:尽最大努力接受我在国家队的角色 需要和3J积极协作
风速62米/秒!9号台风“苏拉”巅峰强度或将与“杜苏芮”齐平
太抽象了!上港球迷集体倒戈,欢庆自家球队输球,反击球员的藐视
完美者途径(怎么没人讨论完美者)
波动少女2鼠标没反应(求大神解决我是win10系统玩波动少女2特别卡顿一开始的界面选择女仆什么的都很流畅)