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

目录
相关文章
|
1月前
|
设计模式
设计模式【二】:工厂模式
设计模式【二】:工厂模式
29 0
|
8月前
|
设计模式 Java
设计模式~工厂模式-03
工厂模式 简单工厂模式 优点: 缺点: 工厂方法模式
37 0
|
12天前
|
设计模式 XML 缓存
设计模式-工厂模式-1-2
【6月更文挑战第11天】工厂模式用于封装对象创建,但当load函数与工厂类耦合时,问题出现。为解决此问题,引入了工厂的工厂,如`RuleConfigParserFactoryMap`,它创建并缓存工厂对象,简化了代码修改。然而,过多的Factory类会增加复杂性,简单工厂模式在此类应用中更为适用。当对象创建逻辑复杂,需组装其他对象或避免if-else时,采用工厂方法模式。抽象工厂则处理多维度分类的对象创建。总结:工厂模式的核心价值在于封装变化、代码复用、隔离复杂性和控制复杂度,适用于创建逻辑复杂的情况,否则直接使用new操作即可。
15 5
|
1月前
|
设计模式 消息中间件 Java
设计模式之工厂模式(C++)
设计模式之工厂模式(C++)
51 0
|
1月前
|
设计模式 前端开发 API
【设计模式】之工厂模式
工厂模式是一种常用的创建对象的设计模式,它通过封装对象的创建逻辑,提供统一的接口,实现了代码的解耦和可扩展性。在实际开发中,可以根据具体需求选择是否使用工厂模式来创建对象。工厂模式可以应用于任何需要创建对象的场景。通过使用工厂模式,我们可以提高代码的可维护性、可扩展性和可测试性,使得代码更加灵活和易于理解。
48 0
|
7月前
|
设计模式 前端开发 Java
设计模式之工厂模式(1)
工厂模式是一种对象创建型模式,它提供了一种创建对象的最佳实践。在工厂模式中,我们在创建对象时不使用 new 关键字,而是通过调用工厂方法来创建对象。工厂方法是一种在子类中定义的方法,该方法负责实例化对象。工厂方法可以返回不同的对象类型,因此工厂模式可以创建一组相关或不相关的对象。这样就可以将对象的创建和使用解耦。
40 0
|
7月前
|
设计模式 Java C#
设计模式之工厂模式(2)
接着,我们定义一个抽象工厂类AbstractFactory,它有两个抽象方法createShape和createColor,分别返回一个Shape对象和一个Color对象: java
30 0
|
10月前
|
设计模式
设计模式之工厂模式
设计模式之工厂模式
49 0
|
11月前
|
设计模式
【设计模式】工厂模式
【设计模式】工厂模式
|
设计模式 SQL 搜索推荐
设计模式之工厂模式(二)
设计模式之工厂模式
95 0