设计模式-工厂模式-1-1

简介: 【6月更文挑战第10天】本文介绍了工厂模式的两种主要类型:简单工厂和工厂方法。简单工厂模式通过工厂类动态创建对象,例如根据配置文件后缀选择不同解析器。为提高可读性和复用性,可将创建逻辑封装到独立类中。当需添加新解析器时,可能涉及对工厂类的修改,但这在偶尔调整时可接受。工厂方法模式则通过多态消除if分支,增加扩展性,更符合开闭原则。当需要新增解析器时,只需创建实现特定接口的新工厂类。

一般情况下,工厂模式分为三种更为细分的类型:简单工厂、工厂方法和抽象工厂。其中,前两者的方法原理比较简单,在实际的项目里也比较常用;而抽象工厂的原理稍微复杂,在实际的项目中相对也不常用。所以,我们今天重点是前两种工厂模式,

简单工厂

在下面这段代码里,我们根据配置文件的后缀(json,xml,yaml, properties),选择不同的解析器(JsonRuleConfigParser, XmlRuleConfigParser),将存在文件中的配置解析成内存对象RuleConfig
2024-06-12-20-16-35-image.png

为了让代码逻辑更加清晰、可读性更好,我们要善于把功能独立的代码块封装成函数,按照这个设计思路,我们可以把代码中设计parse创建的部分逻辑剥离出来,抽象成createParse()函数。重构之后的代码如下所示:


2024-06-12-20-18-05-image.png

为了让类的职责更加单一、代码更加清晰,我们还可以进一步将createParse()函数剥离到一个独立的类中,让这个类只负责对象的创建。而这个类就是简单工厂模式类。


2024-06-12-20-20-18-image.png

大部分工厂类都是以Factory这个单词结尾的,但是也不是必须的;工厂类中创建对象的方法一般是create开头,比如代码里的createParser,但是也有的命名为getInstance(),createInstance(),newInstance,我们根据具体的场景和习惯来命名就好。

在上面的代码里,每次调用RuleConfigParserFactory的createParse的时候,都需要创建一个新的parser。实际上,如果parser可以复用,为了节省内存和对象创建的时间,我们可以把parser事先创建好缓存起来,类似单例模式和工厂模式的结合。


2024-06-12-20-23-10-image.png

思考1:对于上面两种简单工厂模式的实现方法,如果我们要添加新的parser,那势必要改动到RuleConfigParserFactory的代码,那是不是违反开闭原则呢?

如果不是需要频繁地添加新的parser,只是偶尔修改RuleConfigParserFactory代码,稍微不符合开闭原则,也是可以接受的。

思考2:第一种实现里,有一组if分支判断逻辑,是否需要用多态或其他设计模式替代?

如果if分支不是很多,代码中有if分支也是可以接受的。

使用多态或设计模式替代if分支判断逻辑,虽然提高了代码的扩展性,但是也增加了类的个数,牺牲了代码的可读性。

工厂方法

思考3:如果必须将if分支逻辑去掉,那应该怎么办?

比较经典的方法就是利用多态 重构后的代码如下:
2024-06-12-20-27-04-image.png

这就是工厂方法模式的典型代码实现,当新增一种parser的时候,只需要新增一个实现了IRuleConfigParserFactory接口的Factory类即可。所以,工厂方法模式比简单工厂更符合开闭原则

目录
相关文章
|
3月前
|
人工智能 自然语言处理 搜索推荐
2025年11月,中国数字人平台介绍及应用场景全解析
2025年,数字人技术加速落地,凭借AI、图形学与多模态交互融合,广泛应用于金融、教育、政务等领域。
|
2月前
|
存储 弹性计算 关系型数据库
阿里云新用户条件是什么?2026新用户购买阿里云产品有哪些优惠政策?
阿里云新用户分为个人与企业两类,通过实名认证即可享受专属福利。2026年优惠方案丰富:新用户可领取无门槛优惠券(如学生300元券)、满减券及算力补贴;云服务器ECS推出多款特惠实例,如轻量应用服务器年付89元起,经济型e实例99元/年,u1实例199元/年;数据库与存储产品提供首购折扣,RDS低至3折,OSS存储包首年3折;更有50余款产品免费试用,覆盖计算、存储、安全等场景,助力新用户低成本上云。
|
4月前
|
域名解析 网络协议 算法
网络基础知识随记:TCP/IP 网络模型—从分层逻辑到核心知识点
本文系统梳理TCP/IP网络模型的分层架构与核心原理,涵盖应用层、传输层、网络层及网络接口层的关键协议与概念,如HTTP、TCP/UDP、IP、MAC、ARP等,解析数据封装、解封装过程及各层协作机制,帮助读者建立清晰的网络通信认知体系,掌握跨设备通信的底层逻辑。
721 9
网络基础知识随记:TCP/IP 网络模型—从分层逻辑到核心知识点
|
9月前
|
存储 关系型数据库 MySQL
NestJS 配置 TypeORM 进阶教程
本文介绍了在 NestJS 项目中配置 TypeORM 的三种方式:初级阶段直接在 AppModule 中配置;进阶阶段抽离出独立的 DatabaseModule;进一步使用自定义命名空间将数据库配置分离到单独文件,提升可维护性与模块化程度。
445 3
|
10月前
|
人工智能 安全 算法
《大模型开源与闭源的深度博弈:科技新生态下的权衡与抉择》
开源智能体大模型通过开放代码和架构,构建了全球开发者协作网络,降低了技术门槛,使初创企业、小型团队及学术机构能快速进入AI领域。它透明的特性增强了用户信任,但开放性也带来质量与安全挑战。相比之下,闭源模型由大型机构开发,具备专业定制、严格质量和高安全性优势,适合对精准性和保密性要求高的场景,却因高昂成本和技术封闭限制了部分用户的灵活性。两者并非对立,而是互补关系:开源促进创新,闭源保障商用。未来,二者可能融合,形成更优发展模式。
674 31
|
7月前
|
安全 Java 网络安全
RestTemplate使用文件参数的高级应用案例
将这些高级特性组合起来,可以创建一个 `RestTemplate` 实例,它能够处理各种复杂的请求场景,包括大型文件上传、安全的 https 传输和详细的错误管理,在与外部服务的交互过程中提供强大和灵活的 HTTP 客户端功能。
271 0
|
存储 Kubernetes 持续交付
k8s学习
【10月更文挑战第1天】
645 4
配置远程拨号用户发起L2TP隧道连接示例
本文介绍如何在华为设备上配置公网IP地址、路由、L2TP用户及虚拟接口等。具体包括设置GigabitEthernet接口IP,静态路由,创建L2TP组,定义IP池,配置虚拟模板接口,启用L2TP功能并禁用隧道认证,实现用户拨号分配地址与PPP认证功能。附带详细命令行配置代码示例。
配置远程拨号用户发起L2TP隧道连接示例
|
运维 安全 BI
【运维有小邓】如何进行AD域文件权限管理?
在网络资源管理中,谁可访问资源及访问级别至关重要。Active Directory环境下,管理文件服务器权限耗时且繁琐。ADManager Plus提供批量管理用户NTFS和共享权限的功能,简化权限分配、修改与撤销流程,提升管理效率,确保资源安全。通过集中式界面,管理员能快速准确地控制资源访问,优化环境管理。
428 1
【运维有小邓】如何进行AD域文件权限管理?
|
数据管理 大数据 OLAP
AnalyticDB核心概念详解:表、索引与分区
【10月更文挑战第25天】在大数据时代,高效的数据库管理和分析工具变得尤为重要。阿里云的AnalyticDB(ADB)是一款完全托管的实时数据仓库服务,能够支持PB级数据的实时查询和分析。作为一名数据工程师,我有幸在多个项目中使用过AnalyticDB,并积累了丰富的实践经验。本文将从我个人的角度出发,详细介绍AnalyticDB的核心概念,包括表结构设计、索引类型选择和分区策略,帮助读者更有效地组织和管理数据。
615 3

热门文章

最新文章