最新要闻
- 【寻味中华丨饮食】蔡甸藕带:白若玲珑玉 丝缕皆故乡
- 【天天时快讯】699元!XREAL Beam投屏盒子发布:随身携带的“可悬停AR空间屏”
- AMD今晚发布新CPU Intel急了:至强性能比EPYC快7倍
- 【世界新视野】4-1战胜热火!掘金队夺队史首个NBA总冠军:网友发帖祝贺 约老师太强
- 小区门口连装8条减速带 物业回复让业主无语:为防业主逃费
- 贵1000元值不值?i7-13700H和i5-13500H对比实测 世界观点
- 我在塞尔维亚寻找约基奇-每日速递
- 全球微速讯:“铁榔头”郎平重返中学校园,为学弟学妹成长“支招”
- 启明星辰(002439)6月12日主力资金净卖出1310.11万元
- 长安欧尚Z6新能源半年降价3万多被集体投诉 车主:坑惨我们了
- 每日热讯!2折!115网盘618大促:10年VIP只要1000元 赠100TB空间
- 全脂/低脂可选:特仑苏纯牛奶2.7元/盒抄底(商超6元)
- 腾势N7赛道远超宝马X3 赵长江:意向客户看到展车后几乎全下单了
- Fold5、Flip5换壳!三星W24系列折叠屏手机通过认证:25W快充
- 吴尚垠 吴尚_每日消息
- 奶我一口是什么意思网络用语_奶你一口是什么意思简介介绍
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【技术积累】软件设计模式中的工厂模式【一】-独家
什么是工厂模式?
工厂模式是一种设计模式,它利用工厂类来创建对象,而不是在程序中直接实例化对象。
工厂模式可以隐藏创建对象的具体细节,提高代码可维护性和可扩展性。
其核心思想是将对象的创建与具体实现分离开来,通过工厂类统一管理对象的创建,使得客户端无需了解创建对象的具体实现。
(资料图)
工厂类根据客户端请求的不同,返回不同的对象实例。
工厂模式主要包括三种方式:简单工厂模式、工厂方法模式和抽象工厂模式。
什么是简单工厂模式?
简单工厂模式(Simple Factory Pattern),又称静态工厂模式,是一种常见的设计模式之一,它是由一个工厂对象决定创建出哪一种产品类的实例,而客户端不需要知道具体实现类的类名,只需要知道所需产品的类型即可。
简单工厂模式的核心思想是将多个具有共同特征的产品类抽象成一个产品类,并创建一个工厂类来生成这些产品的实例。
这样,客户端只需要传递一个参数给工厂类即可实现创建实例的功能,使得客户端与具体实现类解耦,使得后期维护更加方便。
好比去餐厅吃饭,你只需要跟服务员点菜(请求产品),告诉服务员你想要吃什么菜(指定对象类型),服务员就会为你送上菜(返回对象)。
你不需要知道菜是如何做出来的(对象是如何创建的),只需要享受美食。
这就是简单工厂模式对于对象的创建过程进行了封装,让使用者不需要知道具体的实现过程,更加方便快捷。
// 定义产品抽象类abstract class Product { public abstract void use();}// 定义具体产品类class ProductA extends Product { public void use() { System.out.println("使用产品A"); }}class ProductB extends Product { public void use() { System.out.println("使用产品B"); }}// 定义工厂类class Factory { public static Product createProduct(String type) { if (type.equals("A")) { return new ProductA(); } else if (type.equals("B")) { return new ProductB(); } else { return null; } }}// 客户端使用工厂来创建产品实例public static void main(String[] args) { Product product = Factory.createProduct("A"); product.use();}
简单工厂模式的优点和缺点
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种简单、通用的方式来创建对象,实现了对客户端代码的解耦使得客户端不需要知道对象的具体实现。下面分别详细介绍简单工厂模式的优点和缺点,以及分别用Java伪代码演示。
优点:
1. 降低客户端的耦合度:客户端只需要知道工厂类即可,不需要知道具体的产品类,使得客户端代码与具体类的实现解耦。
2. 客户端不需要知道对象的创建过程:只需要知道工厂类提供的接口即可,无需了解具体对象的创建过程,使得客户端更加容易使用产品类。
3. 工厂方法有利于横向扩展:可以很容易扩展出新的产品类,只需要编写新的产品子类和工厂方法即可。
缺点:
1. 工厂类的职责相对较重,不易于扩展:如果需要添加新的产品类,需要修改工厂类的代码,可能会引起潜在的风险。
2. 不符合开闭原则:增加新的产品需要修改工厂类的代码,不符合开闭原则。
3. 简单工厂类只能创建单一类型的产品,无法满足多种产品的需求。
Java伪代码演示简单工厂模式
//先定义一个抽象产品接口:public interface Product { void run();}//再定义具体产品类:public class ProductA implements Product { @Override public void run() { System.out.println("ProductA is running."); }}public class ProductB implements Product { @Override public void run() { System.out.println("ProductB is running."); }}//定义一个简单的工厂类:public class SimpleFactory { public static Product createProduct(int type) { if (type == 1) { return new ProductA(); } else if (type == 2) { return new ProductB(); } else { return null; } }}
优点的演示:
public class Client { public static void main(String[] args) { Product product = SimpleFactory.createProduct(1); if (product != null) { product.run(); } else { System.out.println("Invalid type."); } }}
这样就可以实现客户端代码与具体类的实现解耦,客户端只需要知道工厂类即可。
缺点的演示:
public class Client { public static void main(String[] args) { Product product = SimpleFactory.createProduct(3); if (product != null) { product.run(); } else { System.out.println("Invalid type."); } }}
当传入参数为3时,会返回null,表示无效的类型,这样就需要修改工厂类的代码,不符合开闭原则。
简单工厂模式的组成部分和工作流程是什么?如何创建一个简单工厂模式
简单工厂模式的组成部分包括:
- 工厂类:负责创建产品的类,通常是一个静态工厂方法,根据不同的参数生成不同的产品。
- 抽象产品类:定义产品的抽象方法或接口,是具体产品类的父类。
- 具体产品类:实现抽象产品类定义的方法或接口,是由工厂类创建的产品。
简单工厂模式的工作流程是:
- 客户端通过调用工厂类的静态工厂方法并传递相应的参数,请求创建产品。
- 工厂类根据传递的参数创建对应的具体产品类实例。
- 工厂类将创建的产品返回给客户端。
- 客户端使用产品实例执行相应的操作。
下面是简单工厂模式的实现步骤:
- 创建一个抽象产品接口:定义了所有产品必须实现的方法。
- 创建具体产品类:实现抽象产品接口,并定义特定于该产品的方法。
- 创建一个工厂类:工厂类包含一个用于创建产品的方法。该方法接受一个参数(通常是一个枚举值或一个字符串),根据参数值的不同返回不同的具体产品对象。
- 在客户端代码中使用工厂类:通过调用工厂类的静态方法,根据需要获取产品。
代码可参照上一个问题的案例
简单工厂模式适用于哪些场景
简单工厂模式适用于以下场景:
- 需要创建的对象较少,通常不超过5个。
- 对象的生成过程比较简单,只需要根据输入参数选择不同的构造方式即可。
- 客户端不需要知道对象的具体类名,只需要知道对象的类型即可。
- 不需要通过继承来实现不同产品之间的差异,只需要通过同一个工厂来创建不同类型的产品即可。
- 最初设计时不确定对象会有哪些具体的子类,但仍然需要通过某种方式来创建这些对象。这时可以先在工厂中添加这些对象,后续再根据需求修改工厂的实现。
总之,简单工厂模式适合于对象较少、生成过程简单、无需知道具体类名、不需要通过继承来实现差异、允许动态修改工厂实现等情况。但是,随着业务增长,可能会变得难以维护,因为所有的创建逻辑都在一个工厂中,容易导致代码量增加、逻辑复杂等问题。因此,在选择使用简单工厂模式时应该注意这些风险,并考虑是否需要更复杂的创建模式来满足业务需求。
简单工厂模式客户端如何处理产品对象的创建异常
简单工厂模式是一种创建型设计模式,其目的是在不暴露创建逻辑的情况下创建对象。但是,当创建过程中出现异常时,客户端需要处理异常,以避免应用程序崩溃。
在简单工厂模式中,客户端通过工厂类创建产品对象。如果创建过程中出现异常,则工厂类需要抛出异常。客户端可以捕获异常,并相应地处理它。
假设有一个形状工厂类,它可以创建不同类型的形状,例如圆形、矩形和三角形。客户端通过提供形状类型来请求创建相应的形状对象。
public class ShapeFactory { public Shape createShape(String shapeType) throws InvalidShapeException { switch (shapeType) { case "circle": return new Circle(); case "rectangle": return new Rectangle(); case "triangle": return new Triangle(); default: throw new InvalidShapeException("Invalid shape type provided: " + shapeType); } }}
在这个工厂类中,如果客户端提供一个无效的形状类型,则会抛出一个无效形状异常(InvalidShapeException)。客户端可以通过捕获此类异常来处理创建过程中的异常。以下是客户端如何处理异常的示例伪代码
try { ShapeFactory shapeFactory = new ShapeFactory(); Shape circle = shapeFactory.createShape("circle"); Shape rectangle = shapeFactory.createShape("rectangle"); Shape triangle = shapeFactory.createShape("triangle"); Shape square = shapeFactory.createShape("square"); //Invalid Shape Type} catch (InvalidShapeException e) { System.out.println(e.getMessage());}
在上述示例中,当客户端请求创建一个无效形状时,工厂类将抛出一个InvalidShapeException。客户端通过捕获此异常并打印其消息来处理创建过程中的异常。
通过这种方式,客户端可以在简单工厂模式中处理异常,并且可以使应用程序从异常中恢复。
抽象工厂模式是什么
抽象工厂模式是一种创建型设计模式,它提供接口用于创建一系列相关或依赖对象,而不需要指定它们的具体类。抽象工厂模式允许客户端使用抽象接口和实现接口分离的方式来创建一组相关的对象。
抽象工厂模式中包含抽象工厂、具体工厂、抽象产品和具体产品四个角色。
- 抽象工厂定义了一组用于创建抽象产品的接口
- 具体工厂实现了抽象工厂中定义的接口,用于生产一组具体产品
- 抽象产品定义了一组用于操作产品的接口
- 具体产品实现了抽象产品中定义的接口。
使用抽象工厂模式,如果需要增加一种产品系列,则只需添加一个新的具体工厂和一组具体产品,而不需要改变已有的代码。
这种模式可以有效地减少代码的耦合性,提高系统的扩展性和灵活性。
抽象工厂模式就是一个厂家能够生产多个系列产品,例如一个化妆品公司可以生产多个系列的护肤品和化妆品。
为了让生产过程更加标准和规范化,该公司会设计多个生产线,每条生产线专门生产一种系列产品。每条生产线里都有专门的设备和加工工艺,不能互相混用,例如生产基础护肤品的生产线不能生产高端抗衰老护肤品。
这时,抽象工厂模式就很适用了。该公司设计一个抽象工厂接口,用于生产一类产品,然后各个生产线分别实现该接口,并且生产出来的产品都要符合该接口标准。这样,不同生产线之间可以互相替换,客户端也无需知道具体的生产过程,只需通过访问抽象工厂接口来获取需要的产品就可以了。
//首先,定义产品族的抽象基类 AbstractProductA 和 AbstractProductB:public abstract class AbstractProductA { public abstract void use();}public abstract class AbstractProductB { public abstract void eat();}//然后,定义不同产品的具体实现类 ProductA1、ProductA2、ProductB1 和 ProductB2:public class ProductA1 extends AbstractProductA { public void use() { System.out.println("Product A1 is used"); }}public class ProductA2 extends AbstractProductA { public void use() { System.out.println("Product A2 is used"); }}public class ProductB1 extends AbstractProductB { public void eat() { System.out.println("Product B1 is eaten"); }}public class ProductB2 extends AbstractProductB { public void eat() { System.out.println("Product B2 is eaten"); }}//接着,定义抽象工厂接口 AbstractFactory,包含用于创建产品族的接口方法:public interface AbstractFactory { public AbstractProductA createProductA(); public AbstractProductB createProductB();}//然后,定义具体的工厂类 ConcreteFactory1 和 ConcreteFactory2,分别实现 AbstractFactory 接口并实现其中的方法:public class ConcreteFactory1 implements AbstractFactory { public AbstractProductA createProductA() { return new ProductA1(); } public AbstractProductB createProductB() { return new ProductB1(); }}public class ConcreteFactory2 implements AbstractFactory { public AbstractProductA createProductA() { return new ProductA2(); } public AbstractProductB createProductB() { return new ProductB2(); }}//最后,客户端只需要访问抽象工厂接口,具体工厂的实例化和具体产品的创建都被封装到工厂内部:public class Client { public static void main(String[] args) { AbstractFactory factory1 = new ConcreteFactory1(); AbstractProductA productA1 = factory1.createProductA(); AbstractProductB productB1 = factory1.createProductB(); productA1.use(); productB1.eat(); AbstractFactory factory2 = new ConcreteFactory2(); AbstractProductA productA2 = factory2.createProductA(); AbstractProductB productB2 = factory2.createProductB(); productA2.use(); productB2.eat(); }}//输出结果为:Product A1 is usedProduct B1 is eatenProduct A2 is usedProduct B2 is eaten//这样,就通过抽象工厂模式创建了不同的产品族,并且客户端与具体产品类实现解耦了。
抽象工厂模式与简单工厂模式的区别
抽象工厂模式和简单工厂模式都是面向对象的创建型设计模式,它们的主要区别在于以下几个方面:
1.抽象工厂模式可以创建一系列关联的产品,而简单工厂只能创建一个产品。
2.在抽象工厂模式中,有多个抽象产品类,每个抽象产品类可以有多个具体产品类实现,而简单工厂模式中,只有一个抽象产品类和一个具体产品类。
3.抽象工厂模式通常是面向一个产品等级结构的,可以扩展不同的产品系列,而简单工厂模式是面向单一产品的。
4.抽象工厂模式要求客户端代码使用抽象接口来创建一组相关的产品对象,而简单工厂模式仅需要一个传递一些参数和一个实例化对象。
5.抽象工厂模式的适用范围比简单工厂模式更广,但实现抽象工厂模式的成本也更高。简单工厂模式较为简单易懂,易于使用和实现。
总之,抽象工厂模式适用于需求变动较频繁,需要同时创建多个产品族的场景。而简单工厂模式适用于创建单一产品,且该产品创建的逻辑不随需求变动。
综上所述,抽象工厂模式和简单工厂都有自己的特点和应用场景,需要根据具体需求选择合适的工厂模式来实现代码。
关键词:
-
STM32F429 Discovery开发板应用:使用FreeRTOS队列+DMA双缓存实现串口数据接收
参考帖子:https: blog csdn net freedompoi article details 1223508
来源: 【技术积累】软件设计模式中的工厂模式【一】-独家
STM32F429 Discovery开发板应用:使用FreeRTOS队列+DMA双缓存实现串口数据接收
【寻味中华丨饮食】蔡甸藕带:白若玲珑玉 丝缕皆故乡
【天天时快讯】699元!XREAL Beam投屏盒子发布:随身携带的“可悬停AR空间屏”
AMD今晚发布新CPU Intel急了:至强性能比EPYC快7倍
【世界新视野】4-1战胜热火!掘金队夺队史首个NBA总冠军:网友发帖祝贺 约老师太强
小区门口连装8条减速带 物业回复让业主无语:为防业主逃费
贵1000元值不值?i7-13700H和i5-13500H对比实测 世界观点
我在塞尔维亚寻找约基奇-每日速递
全球微速讯:“铁榔头”郎平重返中学校园,为学弟学妹成长“支招”
世界最新:深度学习应用篇-推荐系统[11]:推荐系统的组成、场景转化指标(pv点击率,uv点击率,曝光点击率)、用户数据指标等评价指标详解
flutter 日志打印三種方法
最新:Linux根文件制作
热推荐:一对一直播源码平台搭建的关键条件,成败在此。
真刑!几行代码端了整个教务系统。。
启明星辰(002439)6月12日主力资金净卖出1310.11万元
长安欧尚Z6新能源半年降价3万多被集体投诉 车主:坑惨我们了
每日热讯!2折!115网盘618大促:10年VIP只要1000元 赠100TB空间
全脂/低脂可选:特仑苏纯牛奶2.7元/盒抄底(商超6元)
腾势N7赛道远超宝马X3 赵长江:意向客户看到展车后几乎全下单了
Fold5、Flip5换壳!三星W24系列折叠屏手机通过认证:25W快充
吴尚垠 吴尚_每日消息
JAVA非递归生成无限级菜单树的较简代码实现。(非泛用型工具包,仅总结逻辑)
每日关注!低代码开发平台为数智赋能,让开发变得更简单
奶我一口是什么意思网络用语_奶你一口是什么意思简介介绍
腾讯祭出的大招《无畏契约》 能不能成为下一个《英雄联盟》?-环球微速讯
环球观点:最大内存+最美拍照手机!小米Civi 3 1TB上市:2999元
当前消息!满级玩家有盼头了 暗黑世界V等你来
28.98万起 智己LS7都市版上市 CEO刘涛:现在买增程过几年就会焦虑 每日热点
男子洗澡被闯入的两匹“狼”吓坏 经辨认是阿拉斯加 焦点精选
C天键(301383)6月12日主力资金净买入2791.69万元 焦点快看
【当前独家】hvv面试常见框架漏洞
天天热头条丨ldquo 以至 rdquo ldquo 以致 rdquo ldquo 以至于 rdquo 与 ldquo 以致于 rdquo 的区别
蔚来降价3万!李斌:买的起2、30万车的人时间成本很高 时薪200元肯定是有的-世界播报
世界即时:仇恨拉满!日本核污水排放在即 韩国人正疯狂买盐:不敢吃海鲜了
三冠王巡游!曼城全队展示三座奖杯 哈兰德赤膊上阵 城迷疯狂庆祝
每日快报!暂停加息预期支撑多头 美债市场周初表现偏强
微资讯!英伟达市占率超83% 显卡降不降价我说了算!4060系列买到偷着乐?
希捷被重罚3亿美元后!消息称华为不缺硬盘、SSD了:西数持续供货中_每日资讯
十多年了 苹果新款Mac Pro依然不是中国制造:美泰联手组装
芬兰加入北约的军事协调工作结束 双方签署声明 速读
每日速读!读发布!设计与部署稳定的分布式系统(第2版)笔记01_生产环境的生存法则
大家超爱看黑美鱼?《小美人鱼》卖座成2023票房TOP10:国内外口碑两极分化
焦点简讯:漫威等大片国人不爱看了 不符合审美!郭帆:中国电影将弯道超车好莱坞
环球微速讯:香干怎么做比较好吃?
靠给肯德基、麦当劳供货的纸袋大王上市:创始人身价近12亿
一个月3家公司退出:日本手机产业无奈 打不过苹果也打不过小米-世界新消息
天天新动态:618降价英雄:大屏电视跌破2000元该如何买?
绝不降价的蔚来全系降3万!李斌被逼得没辙了
夸克App半夜突然上热搜 网友懵了:没广告很好用
全球报道:鲁葱杂5号_关于鲁葱杂5号简述
开远市气象台发布暴雨蓝色预警信号【Ⅳ级/一般】【2023-06-12】|每日速读
微控制器实时操作系统实践4选择正确的MCU 每日报道
全球短讯!.NET 5 以后的 HttpClient 超时问题
Web安全-渗透测试-信息收集02|环球通讯
还买什么杂牌 小米27寸2K 165Hz显示器到手1159元
贵州“美猴王”打坐冥想神情悠闲 网友:猴子竟也懂养生
全球第三大手机系统鸿蒙4.0来了!华为HDC 2023定档:8月4日见 关注
国际原子能机构总干事已出发前往乌克兰 计划与泽连斯基会面|全球快播
如何解决系统报错:nf_conntrack: table full, dropping packets|天天关注
内存马简单了解(新手向)
头条焦点:小米9号员工李明创业:全球首款Android桌面机器人来了
全年无休的数字人 卷走主播
徕卡超大杯首次进军海外!小米13 Ultra登陆欧洲:售价1499欧超iPhone
讯息:中国最强AI研究院的大模型 为何迟到了
海南女网友感冒 福建小伙骑电摩上高速送药:地图显示要骑77小时|今日热闻
广东惠州可提供联创电压力锅维修服务地址在哪
vulhub靶场搭建,以及使用方法
当前关注:148家企业获评守信示范企业 为历年最多
速读:又一时速350高铁开通在即:贵阳至南宁从5个多小时缩短至2小时
当前焦点!德国人拒绝Intel
高性能还有好身材的RTX轻薄本!华硕灵耀Pro14 2023 13499元起
梅西首次快手直播被吐槽“诈骗”:仅出镜1分钟 还是录播
透气不闷热 骆驼速干运动套装79元(门店778元)_当前速读
速递!文心一言 VS 讯飞星火 VS chatgpt (39)-- 算法导论5.4 3题
ArrayList 底层结构和源码分析 世界观天下
全球最大的红宝石拍卖价格高达2.48亿 创下有史以来最高纪录
保时捷发布其纯电概念hypercar 马力或将达到惊人的1500匹
伏罂而听的故事声音主要是借助于什么传入侦察兵的耳朵_伏罂而听的成语故事
福特回应称没有计划终止福特电马赫公司运营 或有意将“回归”中国运营
复兴号开进青藏铁路进入倒计时 有望7月1日运营
日本正式决定启动福岛核废水排海计划 韩国民众担心吃盐问题
员工因“饭量太大”被解雇要求赔偿 法院:驳回
【环球热闻】微信朋友圈转发扫码免费送米家风扇?小米辟谣:假的
比凯美瑞还便宜!特斯拉Model 3美国售价将低于20万 天天快看
报道:中国2023年汽车销量破1000万辆 出口量暴增 老外爱上国产车
前所未见:Win11神秘版本惊现Win10隐藏壁纸
“前端已死”甚嚣尘上,全栈工程师卷到起飞
磁盘分区
尚医通-day02【医院设置前端详细步骤】(内附源码)|环球快播报
全球热点评!记录--详解 XSS(跨站脚本攻击)
ESMap 三维地图在智慧园区三维场景的应用-数字孪生3D可视化服务平台 当前速递
环球信息:弦歌扬雅韵,诗乐绘情深,云外清音——大提琴与诗词音乐会举行
EDG正式发布Uzi夏季赛定妆照!这就是瘦下来的神吗?
【天天时快讯】特斯拉辅助驾驶4年间在美国发生736起车祸 至少17人遇难
【报资讯】46.9℃!新疆又热到全国第一了
是个大工程!大熊猫洗澡两个半人摁半个负责洗:旁边一只在看戏-观天下
环球今热点:马斯克脑机接口获批人体实验 公司估值高达50亿美元
美迪西:美熹企业通过大宗交易向其一致行动人王国林内部转让79.66万股
基于vue+flask+sql的公司销售采购信息服务系统|环球简讯