最新要闻
- 丽珠集团2023年上半年净利11.35亿 同比增加11.5%
- 吉林省公务员职位表(省考公务员职位表)
- 国银金租(01606.HK)作为出租人订立融资租赁合同
- 真我Buds Air5正式发布:行业最强50dB主动降噪,首销299元
- 已赔付超500万元惠及795户次!东莞厚街政策性农业保险多项指标位居全市前列
- 湖南一季度建筑施工质量标准化项目不合格名单发布,中房瑞致小区等上黑榜
- 小屏旗舰Zenfone系列停更?华硕回应:纯属谣言
- 用户花3299元首发入手真我GT5:这屏占比真的绝了 用5年不成问题
- 惹遍新势力!一网红被小鹏起诉今日开庭 蔚来也向其索赔500万
- iPhone 15系列值不值得买?一定要看清这三件事
- 全国首座“零海拔天文观测站”交付:科考、居住一体
- 8月23日热股前瞻:6股有望获市场关注
- [快讯]骏创科技公布半年报 净利润同比增加84.88%
- 他怎么全身都有种清澈的愚蠢感啊哈哈哈~
- 各地将灾后重建与新一轮洪涝风险应对工作相结合 最大限度确保群众生命财产安全
- 网络销售渠道有哪些(网络销售渠道)
手机
如何迅速打起精神进入复习状态?
win10版本升级工具 win10版本升级
- 如何迅速打起精神进入复习状态?
- win10版本升级工具 win10版本升级
- 海信助力 青岛城市云脑赋能文旅高质量发展
- 【24考研/保研】北航可靠性学院(北航14系)研究方向选择建议及推荐
- 好声音再爆黑幕!潘玮柏导师椅子自动转身,薛之谦疑似被区别对待
- 黄石大广高速东方山互通加速推进,预计明年底可投入使用
家电
【23种设计模式】抽象工厂模式(三)
前言
在抽象工厂模式开篇之前,我们先思考一个问题,如果我们要设计一套房子,其他的组件暂时不考虑,我们仅仅考虑房顶、地板、窗户、房门进行设计。什么样的风格暂时未知,可能会有很多种类。可以先设计一套古典风格的房子,再设计一套现代风格的房子,再设计一套欧式风格的房子....这么多套房子需要设计,需求不断变化,我们该怎么才能后期的维护和扩展就更有利呢?那当然是减少客户端代码与具体产品类之间的依赖,降低了系统的耦合度,这就是抽象工厂模式的优点之处。
抽象工厂模式定义
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 抽象产品类角色(AbstractProduct):为抽象工厂中相互依赖的每种产品定义抽象接口对象,也可以这样说,有几种产品,就要声明几个抽象角色,每一个抽象产品角色和一种具体的产品相匹配。
- 具体产品类(ConcreteProduct):具体产品类实现了抽象产品类,是针对某个具体产品的实现的类型。
- 抽象工厂类角色(Abstract Factory):定义了创建一组相互依赖的产品对象的接口操作,每种操作和每种产品一一对应。
- 具体工厂类角色(ConcreteFactory):实现抽象类里面的所有抽象接口操作,可以创建某系列具体的产品,这些具体的产品是“抽象产品类角色”的子类。
抽象工厂模式代码实现
抽象工厂模式的实现,只需要创建三个类:抽象工厂类,具体风格工厂类和具体产品风格实现类。当然也可以分离成四个类,将设计产品接口从抽象工厂分离出来。以设计欧式风格建筑为例:
(资料图)
创建抽象工厂类
///
/// 抽象工厂类,提供创建不同类型房子的接口 /// public abstract class AbstractFactory { ////// 抽象工厂提供创建一系列产品的接口——抽象方法,这里作为例子,只给出了房顶、地板、窗户和房门创建接口 /// 【1】房顶创建接口 /// ///public abstract Roof CreateRoof(); /// /// 【2】地板创建接口 /// ///public abstract Floor CreateFloor(); /// /// 【3】窗户创建接口 /// ///public abstract Window CreateWindow(); /// /// 【4】房门创建接口 /// ///public abstract Door CreateDoor(); } #region 可以分离出来到单独Class文件的产品接口 /// /// 房顶抽象类,子类的房顶必须继承该类 /// public abstract class Roof { ////// 创建房顶 /// public abstract void Create(); } ////// 地板抽象类,子类的地板必须继承该类 /// public abstract class Floor { ////// 创建地板 /// public abstract void Create(); } ////// 窗户抽象类,子类的窗户必须继承该类 /// public abstract class Window { ////// 创建窗户 /// public abstract void Create(); } ////// 房门抽象类,子类的房门必须继承该类 /// public abstract class Door { ////// 创建房门 /// public abstract void Create(); } #endregion创建欧式风格工厂
///
/// 欧式风格房子的工厂,负责创建欧式风格的房子 /// public class EuropeanFactory : AbstractFactory { // 制作欧式房顶 public override Roof CreateRoof() { return new EuropeanRoof(); } // 制作欧式地板 public override Floor CreateFloor() { return new EuropeanFloor(); } // 制作欧式窗户 public override Window CreateWindow() { return new EuropeanWindow(); } // 制作欧式房门 public override Door CreateDoor() { return new EuropeanDoor(); } }创建欧式风格实现
///
/// European 欧式风格建筑 /// public class European { ////// 欧式地板类 /// public class EuropeanFloor : Floor { public override void Create() { Console.WriteLine("创建欧式的地板"); } } ////// 欧式的房顶 /// public class EuropeanRoof : Roof { public override void Create() { Console.WriteLine("创建欧式的房顶"); } } //////欧式的窗户 /// public class EuropeanWindow : Window { public override void Create() { Console.WriteLine("创建欧式的窗户"); } } ////// 欧式的房门 /// public class EuropeanDoor : Door { public override void Create() { Console.WriteLine("创建欧式的房门"); } } }欧式风格调用
public void RunTest() { // 欧式风格的房子 Console.WriteLine("开始设计欧式风格房子!"); AbstractFactory europeanFactory = new EuropeanFactory(); europeanFactory.CreateRoof().Create(); europeanFactory.CreateFloor().Create(); europeanFactory.CreateWindow().Create(); europeanFactory.CreateDoor().Create(); }
如果新需求设计新的风格房子,现代风格建筑,只需要创建对应的具体实现工厂和具体产品分风格设计实现。
创建现代风格工厂
///
/// 现在风格房子的工厂,负责创建现代风格的房子 /// public class ModernizationFactory : AbstractFactory { // 制作现代房顶 public override Roof CreateRoof() { return new ModernizationRoof(); } // 制作现代地板 public override Floor CreateFloor() { return new ModernizationFloor(); } // 制作现代窗户 public override Window CreateWindow() { return new ModernizationWindow(); } // 制作现代房门 public override Door CreateDoor() { return new ModernizationDoor(); } }创建现代风格实现
///
/// Modernization 现代风格建筑 /// public class Modernization { ////// 现代的房顶 /// public class ModernizationRoof : Roof { public override void Create() { Console.WriteLine("创建现代的房顶"); } } ////// 现代的地板 /// public class ModernizationFloor : Floor { public override void Create() { Console.WriteLine("创建现代的地板"); } } ////// 现代的窗户 /// public class ModernizationWindow : Window { public override void Create() { Console.WriteLine("创建现代的窗户"); } } ////// 现代的房门 /// public class ModernizationDoor : Door { public override void Create() { Console.WriteLine("创建现代的房门"); } } }现代风格调用
public void RunTest() { // 欧式风格的房子 Console.WriteLine("开始设计欧式风格房子!"); AbstractFactory europeanFactory = new EuropeanFactory(); europeanFactory.CreateRoof().Create(); europeanFactory.CreateFloor().Create(); europeanFactory.CreateWindow().Create(); europeanFactory.CreateDoor().Create(); //现代风格的房子 Console.WriteLine("开始设计现代风格的房子!"); AbstractFactory modernizationFactory = new ModernizationFactory(); modernizationFactory.CreateRoof().Create(); modernizationFactory.CreateFloor().Create(); modernizationFactory.CreateWindow().Create(); modernizationFactory.CreateDoor().Create(); }
抽象工厂模式的优缺点
优点:
【抽象工厂模式】将系列产品的创建工作延迟到具体工厂的子类中,我们声明工厂类变量的时候是使用的抽象类型,同理,我们使用产品类型也是抽象类型,这样做就尽可能的可以减少客户端代码与具体产品类之间的依赖,从而降低了系统的耦合度。耦合度降低了,对于后期的维护和扩展就更有利,这也就是【抽象工厂模式】的优点所在。
缺点:
【抽象工厂模式】很难支持增加新产品的变化,这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类以及所有子类的改变,这样也就违背了“开放—封闭”原则。
关键词:
【23种设计模式】抽象工厂模式(三)
菜部·苋(关于菜部·苋简述)
朱彦硕:南苏丹注意力总挺不下来 中国要能僵持到末节就有机会
如何迅速打起精神进入复习状态?
菜鸟总动员:毕业(关于菜鸟总动员:毕业简述)
农房检测开始!每年一次每平2块7,拒不配合检测最高罚款5万元!
2019年国考是什么时候考试 2019年国考考试时间
浮空秘境女武神怎么获取
莱芜正雨节水灌溉设备有限公司(关于莱芜正雨节水灌溉设备有限公司简述)
粤港澳社会组织创建青年创业就业合作平台
广汽传祺2020新款混合动力(广汽传祺混动suv车型有哪些?)
离婚孩子给女方吗,法律是如何规定的
最好的ppt模板下载网站 好用的ppt模板免费下载网站
名雕股份:研发投入下滑三成,自有物业租赁收入大增257%丨中报拆解
江西省上栗县总工会开展“金秋助学”活动
学农1号(关于学农1号简述)
学前儿童发展心理(关于学前儿童发展心理简述)
智慧教育平台助力教师提升国家统编教材教育教学能力
win10版本升级工具 win10版本升级
热气腾腾!湖南日报“全媒大脑”新闻实训营加推“营养大餐”
申昊科技:上半年净利润同比增178.26%
Holesky 公共测试网创世文件已生成
雪碧名师高徒2010吴文景(雪碧名师高徒)
依托30年临床经验 华邦健康积极向皮肤消费领域延伸
宜春八景内容简介_宜春八景
迪马:米兰正在为塔雷米准备一份不高于2000万欧的最终报价
永达股份:董秘履历与官宣对垒 入职同月其配偶及实控人好友“突击”入股
好太太科技荣获省级企业技术中心认定,引领智能家居创新新时代
菲律宾回流人员亲述:我是如何在网络赌博公司割“菠菜”的
永州市映山小学:教师集中培训为新学期蓄力
利亚德(300296.SZ):上半年净利增26.45%至3.38亿元
阿古茹奥特曼UR蓝宝镯25周年版玩具公开 不能自动旋转 收录SV音效
电动三轮车提速掉一两格电,有哪些原因?告诉你,可能有这几个
这些表现,是中年女人给你的暗示,她想做你的女人
国网信通2023年上半年净利2.5亿 同比增加8.19%
丽珠集团2023年上半年净利11.35亿 同比增加11.5%
丰田召回事件(丰田召回事件案例伦理
雨水赖着不走,晴天推迟上线
海信助力 青岛城市云脑赋能文旅高质量发展
吉林省公务员职位表(省考公务员职位表)
嵇这个姓怎么来的(嵇姓怎么读)
披荆斩棘给林志颖安排了单人间 基本情况讲解
【Phigros/十级英语听力现场】Another Round歌词
港股何时见底?三大指数集体收涨,中特估概念延续热度
风笛(明日方舟同人图集)
国际医学2023年上半年净利-2.22亿 亏损减少62.69%
【24考研/保研】北航可靠性学院(北航14系)研究方向选择建议及推荐
中国广核2023年上半年净利69.59亿 同比增加17.91%
美国30年期固定抵押贷款利率跃升至7.31%,为2000年以来最高。
减振器的作用是什么 什么减振器好
狼来了的寓意是什么(狼来了的寓意是什么意思)
新大洲高速电摩TS3亮相!搭载水冷中置电机,标配双通道ABS碟刹!
在阅读中走向诗和远方
再见,皇马!法媒正式确认,姆巴佩不离队,或天价续约,终老巴黎
大咖云集!专家学者为“关爱之城”建言献策 深圳关爱行动20周年研讨会在深举行
1973-2023,“香港小姐”何处去
MAS国际齐舞大赛总决赛落地烟台,推动烟台青年文化发展
工商银行龙凤呈祥金条50克价格今天多少一克(2023年08月28日)
国银金租(01606.HK)作为出租人订立融资租赁合同
家境普通的孩子,还拼得起吗?
sim卡被拒是什么意思(sim卡被拒)
图解澄天伟业中报:第二季度单季净利润同比减25.56%
好声音再爆黑幕!潘玮柏导师椅子自动转身,薛之谦疑似被区别对待
琵琶行原文郎读(琵琶行朗读完整版原文)
温州将投用18辆“纯电版”亚运专用车
广西首趟!35吨宽体箱铁海联运班列顺利发车
真我Buds Air5正式发布:行业最强50dB主动降噪,首销299元
银行从业人士透露存量房贷利率即将下调 但这一消息尚未获得官方确认
9月1日起,这些医药卫生新规将影响你我健康生活
系统之男神有毒小说(系统之男神有毒)
已赔付超500万元惠及795户次!东莞厚街政策性农业保险多项指标位居全市前列
8月21日-25日中信证券债券承销金额较高 达731.60亿元
“李跳跳”为何成了大厂公敌?
滴滴向小鹏汽车出售智能电动汽车相关资产和研发能力
深度研究丨产业园区:火爆轻资产市场背后的冷思考
湖南一季度建筑施工质量标准化项目不合格名单发布,中房瑞致小区等上黑榜
搭载月面探测器的日本H2A火箭发射第三次取消
黄石大广高速东方山互通加速推进,预计明年底可投入使用
小屏旗舰Zenfone系列停更?华硕回应:纯属谣言
用户花3299元首发入手真我GT5:这屏占比真的绝了 用5年不成问题
惹遍新势力!一网红被小鹏起诉今日开庭 蔚来也向其索赔500万
iPhone 15系列值不值得买?一定要看清这三件事
全国首座“零海拔天文观测站”交付:科考、居住一体
汤普森中国行曝光其最新签名鞋“安踏KT9-克雷船长”
华西证券:给予伟星新材买入评级
肥东一中举行2023级高一新生国防教育暨军训开训式
龙源技术达证券投资者于8月25日调研我司
印花税减半叠多重利好超预期!股民“等不及了,建议连夜开盘”,基金公司火热解读
叶聪:潜入深海,勇攀高峰
中银证券管涛:要通过全面深化改革开放 激发市场主体活力
梦见别人给我苹果吃是什么意思
灵车漂移坟头蹦迪什么意思
红网夜读|我们在世上不过逗留短短一段时间,凡事应以快乐为准
篮网公开招募哈登!蔡崇信愿意给他2.18亿顶薪,承诺3大特权
东盟三国签署本币交易协议,减少对美元依赖
他在“MT4”平台上充值1200多万元,结果……|今晚九点半
安力夫同志逝世
新华全媒+丨争分夺秒 尽快全面恢复生产生活秩序
8月23日热股前瞻:6股有望获市场关注
超值好物!戴尔灵越3530仅售4499元