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

简介: 【6月更文挑战第11天】工厂模式用于封装对象创建,但当load函数与工厂类耦合时,问题出现。为解决此问题,引入了工厂的工厂,如`RuleConfigParserFactoryMap`,它创建并缓存工厂对象,简化了代码修改。然而,过多的Factory类会增加复杂性,简单工厂模式在此类应用中更为适用。当对象创建逻辑复杂,需组装其他对象或避免if-else时,采用工厂方法模式。抽象工厂则处理多维度分类的对象创建。总结:工厂模式的核心价值在于封装变化、代码复用、隔离复杂性和控制复杂度,适用于创建逻辑复杂的情况,否则直接使用new操作即可。

但是实际上上述的方法存在很大的问题,在使用这些工厂类的时候,如何写load函数呢?


2024-06-12-20-29-39-image.png

工厂类对象的创建逻辑又耦合进了load函数里,跟最初的代码版本很相似。那么怎么解决这个问题呢?

可以为工厂类再创建一个简单工厂,也就是工厂的工厂,用来创建工厂类对象。代码如下,其中RuleConfigParserFactoryMap类是创建工厂对象的工厂类,RuleConfigParserFactoryMap返回的是缓存好的单例工厂对象。
2024-06-12-20-32-33-image.png


2024-06-12-20-32-51-image.png

当我们需要添加新的规则配置解析器时,我们只需要创建新的parser类和parser factory类,并且在RuleConfigParserFactoryMap类里,将新的parser factory对象添加到cachedFactories里即可,代码的改动很少,基本上符合开闭原则。

实际上,对于规则配置文件解析这个应用场景来说,工厂模式需要额外创建诸多Factory类,也会增加代码的复杂性。而且,每个Factory类只是做简单的new操作,功能单薄,也没必要设计成独立的类。所以在这个应用场景下,简单工厂模式简单好用,比工厂方法模式更加合适。

思考:什么时候该用工厂方法模式,而非简单工厂模式?

对象的创建逻辑比较复杂,不是简单的new一下就可以,而是要组装其他类对象,做各种初始化操作的时候,推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,让每个工厂类都不至于过于复杂。

某些场景下,如果对象不可复用,工厂类每次都要返回不同的对象,如果用简单工厂模式实现,就只能选择第一种包含if分支逻辑的实现方式。如果我们还想避免烦人的if-else分支逻辑,就推荐使用工厂方法模式

抽象工厂

在简单工厂和工厂方法中,类只有一种分类方法。比如在规则配置解析的例子里,解析器类只会根据配置文件格式(Json,xml,yaml)来分类。但是,如果类又两种分类方式。比如,我们既可以按照配置文件格式来分类,也可以按照解析的对象(Rule规则配置还是System系统配置)来分类,就会对应下面8个parser类。
2024-06-12-20-43-40-image.png

针对这种特殊的场景,如果还是继续用工厂方法来实现的话,我们要针对每个parser都编写一个工厂类,也就是要编写8个工厂类。如果未来还要增加针对业务配置的解析器,比如IBizConfigParser,还需要再增加4个工厂类。

抽象工厂就是针对这种非常特殊的场景而诞生的,我们可以让一个工厂负责创建多个不同类型的对象(IRuleConfigParser、ISystemConfigParser 等),而不是只创建一种parser对象。
2024-06-12-20-48-54-image.png


2024-06-12-20-49-01-image.png

目录
相关文章
|
1月前
|
设计模式
设计模式【二】:工厂模式
设计模式【二】:工厂模式
29 0
|
8月前
|
设计模式 Java
设计模式~工厂模式-03
工厂模式 简单工厂模式 优点: 缺点: 工厂方法模式
37 0
|
9月前
|
设计模式 Java C++
设计模式之工厂模式详解和应用
设计模式之工厂模式详解和应用
38 0
|
1月前
|
设计模式 算法 uml
C++设计模式(工厂模式)
C++设计模式(工厂模式)
56 1
C++设计模式(工厂模式)
|
1月前
|
设计模式 前端开发 API
【设计模式】之工厂模式
工厂模式是一种常用的创建对象的设计模式,它通过封装对象的创建逻辑,提供统一的接口,实现了代码的解耦和可扩展性。在实际开发中,可以根据具体需求选择是否使用工厂模式来创建对象。工厂模式可以应用于任何需要创建对象的场景。通过使用工厂模式,我们可以提高代码的可维护性、可扩展性和可测试性,使得代码更加灵活和易于理解。
48 0
|
7月前
|
设计模式 前端开发 Java
设计模式之工厂模式(1)
工厂模式是一种对象创建型模式,它提供了一种创建对象的最佳实践。在工厂模式中,我们在创建对象时不使用 new 关键字,而是通过调用工厂方法来创建对象。工厂方法是一种在子类中定义的方法,该方法负责实例化对象。工厂方法可以返回不同的对象类型,因此工厂模式可以创建一组相关或不相关的对象。这样就可以将对象的创建和使用解耦。
40 0
|
10月前
|
设计模式
设计模式之工厂模式
设计模式之工厂模式
49 0
|
11月前
|
设计模式
【设计模式】工厂模式
【设计模式】工厂模式
|
设计模式 Java 数据库
设计模式之工厂模式(一)
设计模式之工厂模式
52 0
|
设计模式 SQL 搜索推荐
设计模式之工厂模式(二)
设计模式之工厂模式
95 0