设计模式(二)-创建者模式(3)-抽象工厂模式

一、为什么需要抽象工厂模式?

在工厂模式中,我们需要定义多个继承于共同工厂抽象基类的工厂子类,这些子类负责创建一个对应的对象。工厂模式存在一个缺点就是:每次扩展新的工厂子类,就会增加系统的复杂度。

如果我们知道把所有产品(比如车)分为几个产品族(比如自行车族、汽车族),那么工厂子类就对应指定的产品族进行“批量”创建对象。若有新的产品,则工厂子类创建该新产品对象。(工厂子类内部逻辑,类似于简单工厂模式)

抽象工厂模式 ,类似于简单工厂模式和工厂模式混合运用而成的模式。(参考上篇文章“工厂模式”的最后一个代码例子)

优点: 不需要每次定义一个新的产品类时,就要扩展新的工厂子类。工厂子类提供一个产品族中多个对象的创建工作,客户端可以方便使用某个产品族中的对象。

缺点: 产品族扩展难。要增加一个新系列的某一产品,要定义产品抽象类、产品实现类,工厂抽象基类,工厂子类。

【角色】
某系列抽象基类: 用以定义某产品族的特征和行为的抽象接口。
某系列的某产品实现类: 继承某系列抽象基类,用以实现某系列里某产品的特征和行为的具体类。
工厂抽象基类: 用以定义创建对象的特征的抽象接口。特征行为包括提供某系列产品的抽象方法。
工厂子类: 对对应的实现类进行实例化。实现提供某系列某产品的方法。

请添加图片描述

二、例子

需求: 假定某些地方的主要交通工具有自行车和汽车。为了满足人们交通便利的需求,现有XX公司和YY公司这两家公司,对市场推行了两种运营模式:租车和共享车。也就是说,租车和共享车是这两家公司所推广的两个产品系列业务,即两个产品族。

1)定义产品族和具体产品


//共享车系列(产品族)public abstract class Share{public abstract void Move();}//租借车系列public abstract class Rent{public abstract void Move();}//XX公司-共享-自行车public class XXBikeShare : Share{public override void Move(){Console.WriteLine("Share XXBike move.");}}//XX公司-共享-汽车public class XXCarShare : Share{public override void Move(){Console.WriteLine("share XXCar move.");}}//XX公司-租借-自行车public class XXBikeRent : Rent{public override void Move(){Console.WriteLine("Rent XXBike move.");}}//XX公司-租借-汽车public class XXCarRent : Rent{public override void Move(){Console.WriteLine("Rent XXCar move.");}}//YY公司-共享-自行车public class YYBikeShare : Share{public override void Move() {Console.WriteLine("share YYBike move.");}}//YY公司-共享-汽车public class YYCarShare : Share{public override void Move() {Console.WriteLine("share YYCar move.");}}//YY公司-租借-自行车public class YYBikeRent : Rent{public override void Move(){Console.WriteLine("Rent YYBike move.");}}//YY公司-租借-汽车public class YYCarRent : Rent{public override void Move(){Console.WriteLine("Rent YYCar move.");}}

2)定义工厂基类和工厂子类


//定义提供两个产品族的抽象方法public abstract class Factory{public abstract Share ProvideS(string args);public abstract Rent ProvideR(string args);}//XX公司落实产品业务:租借和共享public class XXFactory : Factory{public override Share ProvideS(string args){Share share = null;switch (args){case "XXBike":share = new XXBikeShare(); break;case "XXCar":share = new XXCarShare(); break;default:throw new ArgumentException("args is Invalid. new obj failed.");}return share;}public override Rent ProvideR(string args){Rent rent = null;switch (args){case "XXBike":rent = new XXCarRent(); break;case "XXCar":rent = new XXBikeRent(); break;default:throw new ArgumentException("args is Invalid. new obj failed.");}return rent;}}//YY公司落实产品业务:租借和共享public class YYFactory : Factory{public override Share ProvideS(string args){Share share = null;switch (args){case "YYBike":share = new YYBikeShare(); break;case "YYCar":share = new YYCarShare(); break;default:throw new ArgumentException("args is Invalid. new obj failed.");}return share;}public override Rent ProvideR(string args){Rent rent = null;switch (args){case "YYBike":rent = new YYBikeRent(); break;case "YYCar":rent = new YYCarRent(); break;default:throw new ArgumentException("args is Invalid. new obj failed.");}return rent;}}

3)在客户端使用


class Program{static void Main(string[] args){Factory xx = new XXFactory();Factory yy = new YYFactory();var sharexxCar = xx.ProvideS("XXCar");sharexxCar.Move();var rentyyBike = yy.ProvideR("YYBike");rentyyBike.Move();Console.ReadLine();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TP_Link WR886N 硬改闪存16M内存64M,刷入openwrt

一、换内存,拆闪存: 1、先原机开机试试是否功能正常; 2、拆机,比较难拆,容易坏外壳; 3、找到内存和闪存,用胶带把边上的小元件,电阻都贴好; 4、加助焊油,用风…

PC3329L DC-DC降压 10V-100V输入3A大流输出带EN功能实现零功耗只需极少元器件

1. PC3392L特性  通过使能脚关断实现零功耗  宽电压输入范围 10V 至 100V  最大输出电流 3A  集成功率 MOS 管  外围器件少  输出短路保护  温度保护  逐周期限流  输出电压灵活可靠  ESOP8 2. 描述 PC3392L 一款宽电压范围降压型 DC-DC 电源管…

C# 实现腾讯云多路直播流的云端混合录制

目录 应用场景 腾讯云直播和云点播 产品架构 混流显示示例 关键代码 API实现 小结 应用场景 在云考试或视频面试中,除了对考生、考官的实时音视频监控以防止作弊行为的发生以外,对直播流的音视频录制也尤为重要,可做为后期证据材料进…

斯坦福机器学习 Lecture2 (假设函数、参数、样本等等术语,还有批量梯度下降法、随机梯度下降法 SGD 以及它们的相关推导,还有正态方程)

假设函数定义 假设函数,猜一个 x->y 的类型,比如 y ax b,随后监督学习的任务就是找到误差最低的 a 和 b 参数 有时候我们可以定义 x0 1,来让假设函数的整个表达式一致统一 如上图是机器学习中的一些术语 额外的符号&#xf…

spring boot加mybatis puls实现,在新增/修改时,对某些字段进行处理,使用的@TableField()

1.先说场景,在对mysql数据库表数据插入或者更新时都得记录时间和用户id 传统实现有点繁琐,这里还可以封装一下公共方法。 2.解决方法: 2.1:使用aop切面编程(记录一下,有时间再攻克)。 2.2&…

宝塔站点配置

我这里使用的thinkphp 框架部署的

SaleSmartly新增AI意图识别触发器!让客户享受更精准的自动化服务

AI意图识别技术是对话式AI中很重要的组成部分,通俗点来说就是一种可以识别用户在对话中表达的意图的技术。通过对大量数据的分析和学习,AI可以理解用户想要获得的信息,并根据这些信息来采取相应的行动或提供相应的响应。而在对话式AI中&#…

手机LiDAR-based激光雷达标定板提高无人汽车智能化程度

手机LiDAR-based 3D扫描和建模测试系统是一种利用激光雷达(LiDAR)技术进行三维扫描和模型创建的工具,它可以在手机上运行。这种测试系统可以用于各种应用,如地形测绘、建筑物建模、机器人视觉、无人驾驶汽车导航等。 手机LiDAR-ba…

云端援手:智能枢纽应对数字资产挑战 ——华为云11.11应用集成管理与创新专区优惠限时购

现新客3.96元起,下单有机会抽HUAWEI P60 Art 福利仅限双十一 机会唾手可得,立即行动! 「有效管理保护应用与数据的同时实现高效互通」——华为云全力满足企业需求,推出全套「应用集成管理与创新」智能解决方案:华为云…

家电电器展示预约小程序的作用是什么

电器产品已经成为人们生活的必备品,如冰箱、电视机、洗衣机等,而这些产品的购买方式也很多,可以到线下门店购买,也可以到线上多个电商平台购买,如今互联网高速发展以及民众享受线上服务带来的便捷性,同时商…

SSL证书对网站SEO的好处

随着网络安全意识的提高,越来越多的网站开始采用SSL证书来保护自己的数据传输过程。那么,SSL证书真的能为网站SEO带来好处吗?下面将为您分析这个问题。 加强用户体验和信任度 SSL证书不仅能确保数据传输的安全性,还能让客户感受…

『亚马逊云科技产品测评』活动征文|基于next.js搭建一个企业官网

『亚马逊云科技产品测评』活动征文|基于next.js搭建一个企业官网 授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方…

MySQL数据库入门到大牛_基础_09_子查询(子查询分类方法;单行子查询,多行子查询;相关子查询)

前面的第三章到第八章中,我们讲的是查询,查询的基本结构已经进行了介绍,聚合函数学习完后已经介绍了查询语句的完整的执行流程。 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。本章也是查询…

3D建模基础教程:编辑多边形功能命令快捷方式

一、打开3D软件并创建新模型 首先,打开你的3D建模软件,比如Blender、Maya或3ds Max。然后,创建一个新的3D模型。你可以使用基本几何体来创建模型,也可以导入现有的模型。 二、进入编辑多边形模式 在主工具栏中,找到并…

使用JDK自带java.util.logging.Logger引起的冲突问题

现象: 应用代码如下: import javax.script.ScriptEngineManager;ScriptEngineManager manager new ScriptEngineManager(); manager.getEngineByName("JavaScript"); 在TongWeb8上运行出错,日志如下: Servlet.servi…

WinForms C# 导入和导出 CSV 文件 Spread.NET

使用 WinForms C# 和 VB.NET 导入和导出 CSV 文件 2023 年 11 月 17 日 使用 Spread.NET 直接在 .NET WinForms 应用程序中处理 CSV 文件。 Spread.NET可帮助您创建电子表格、网格、仪表板和表单。它包括一个强大的计算引擎,具有 450 多个函数以及导入和导出 Micros…

安全测试工具分为 SAST、DAST和IAST 您知道吗?

相信刚刚步入安全测试领域的同学都会发现,安全测试领域工具甚多,不知如何选择!其实安全测试工具大致分为三类:SAST、DAST和IAST。本文就带大家快速的了解这三者的本质区别! SAST (Static Application Secu…

浪涌防护器件要选对,布局布线更重要!|深圳比创达电子EMC(下)

浪涌测试,作为最常见的EMC抗干扰测试项目之一,基本上是家用消费电子必测的项目;其测试目的是为了验证产品在承受外部的浪涌冲击时能否正常工作。 一、比创达整改案例 1) 背景: 某智能插座产品在浪涌测试,需要过2kV差…

基于IDEA进行Maven工程构建

Java全能学习面试指南:https://javaxiaobear.cn 1. 构建概念和构建过程 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中…

振弦式渗压计的安装方式及注意要点

振弦式渗压计的安装方式及注意要点 振弦式渗压计是一种高精度、高效率的地下水位测量仪器。它可以测量地下水位的高度,计算地下水的压力,从而推算出地下水的流量。对于地下水资源管理和保护、治理工程等方面具有非常重要的意义。在安装振弦式渗压计时&a…