设计模式-工厂模式-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类即可。所以,工厂方法模式比简单工厂更符合开闭原则

目录
相关文章
|
6月前
|
设计模式 存储 Java
设计模式-工厂模式
设计模式-工厂模式
67 1
|
6月前
|
设计模式
设计模式【二】:工厂模式
设计模式【二】:工厂模式
45 0
|
设计模式 Java
设计模式~工厂模式-03
工厂模式 简单工厂模式 优点: 缺点: 工厂方法模式
53 0
|
2月前
|
设计模式 Java 关系型数据库
设计模式——工厂模式
工厂模式介绍、静态简单工厂模式、工厂方法模式、抽象工厂模式、JDK 源码分析
设计模式——工厂模式
|
6月前
|
设计模式 消息中间件 Java
设计模式之工厂模式(C++)
设计模式之工厂模式(C++)
78 0
|
6月前
|
设计模式 前端开发 API
【设计模式】之工厂模式
工厂模式是一种常用的创建对象的设计模式,它通过封装对象的创建逻辑,提供统一的接口,实现了代码的解耦和可扩展性。在实际开发中,可以根据具体需求选择是否使用工厂模式来创建对象。工厂模式可以应用于任何需要创建对象的场景。通过使用工厂模式,我们可以提高代码的可维护性、可扩展性和可测试性,使得代码更加灵活和易于理解。
75 0
|
设计模式 Java C#
设计模式之工厂模式(2)
接着,我们定义一个抽象工厂类AbstractFactory,它有两个抽象方法createShape和createColor,分别返回一个Shape对象和一个Color对象: java
51 0
|
设计模式
设计模式之工厂模式
设计模式之工厂模式
63 0
|
设计模式
【设计模式】工厂模式
【设计模式】工厂模式
|
设计模式 Java 数据库
设计模式之工厂模式(一)
设计模式之工厂模式
61 0