首页 >> 大全

什么是工厂模式?你以为工厂模式很简单

2022-07-06 大全 156 作者:考证青年

很多人认为工厂模式很简单,它只是有一个构造工厂来帮助我们进行对象构造。然后尝试回答以下问题:

如果你能很好地回答以上四个问题,那么就没有必要继续看这篇文章了。否则,我建议你仔细研究这篇文章。

1 三种工厂模式

工厂模式可以分为三类:

这三种模式自上而下逐渐抽象,更加通用。

GOF 在《设计模式》一书中将工厂模式分为两类:工厂方法模式( )和抽象工厂模式( )。

将简单工厂模式 ( ) 视为工厂方法模式的一个特例,并将两者组合在一起。

这三种工厂模式都是设计模式分类中的创造模式。

创建模式( )抽象了类的实例化过程,可以将软件模块中对象的创建与对象的使用分开。为了让软件的结构更加清晰,外界只需要知道它们对这些对象的通用接口,而不需要知道具体的实现细节,从而使整个系统的设计更符合单一职责的原则.

创建模式在创建什么(什么)、谁创建它(谁)以及何时创建(何时)方面为软件设计人员提供了尽可能多的灵活性。

创建模式隐藏了如何创建类实例的细节,通过隐藏对象的创建和组合方式使整个系统独立。

工厂模式是最重要的创建模式。工厂模式的主要作用是帮助我们实例化对象。之所以名称中包含工厂模式四个字,是因为对象的实例化过程是由工厂实现的,新的操作由工厂代替。

这样做的好处是它封装了对象的实例化细节,特别是在实例化复杂或者对象的生命周期应该集中管理的情况下。它将以尽可能少的修改为您的系统带来更大的可扩展性。

接下来,我们将分别介绍这三种工厂模式。

2 简单工厂模式

简单工厂模式是一种创建模式,也称为静态工厂方法()模式。简单的工厂模式是工厂对象决定创建产品类的哪个实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为不同工厂模式的特殊实现。

在介绍简单工厂模式之前,我们尝试解决以下问题:

现在我们将以面向对象的形式定义计算器,以解耦算法。使用的主要类如下:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

当我想执行加法操作时,我可以使用这样的代码:

当我需要执行减法运算时,我创建了一个类。也就是说,当我想使用不同的操作时,我需要创建不同的类,并且我需要明确知道类的名称。

那么这种创建类的重复工作其实可以放到一个统一的工厂类中。简单工厂模式具有以下优点:

简单工厂模式实现

简单工厂模式其实就像它的名字一样简单。我们来看看它的组成:

:这是这个模型的核心,包含一定的业务逻辑和判断逻辑。在java中,它通常由一个具体的类来实现。( )

:一般是具体产品继承的父类或者实现的接口。在java中,它是通过接口或抽象类来实现的。( )

:工厂类创建的对象就是这个角色的一个实例。由java中的具体类实现。使用类图清楚地表示它们之间的关系(\等)

关系图如下:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

在原有类的基础上,定义工厂类:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

一旦有了工厂类,就可以使用工厂来创建对象:

通过简单工厂模式,计算器的用户不需要知道实现加法逻辑的类的具体名称,只需要知道该类对应的参数“+”即可。

简单工厂模式的问题

当我们需要添加一个计算时,比如平方根。这时候我们需要先定义一个类继承类,实现方码。另外,我们还要修改类的代码,增加一个case。这显然违反了开闭原则。可想而知,工厂对于新产品的加入非常被动。

我们的例子是最简单的情况。在实际应用中,产品很可能是多级树形结构。简单的工厂可能无法正常工作。

简单工厂模式总结

工厂类是整个简单工厂模式的关键。它包含必要的逻辑判断,根据外界给出的信息来决定应该创建哪个具体的类对象。通过使用工厂类,外界可以摆脱直接创建特定产品对象的尴尬局面,只需要负责“消费”对象即可。不管这些对象是如何创建和组织的。明确各自的责任和权利,有利于整个软件架构的优化。

但是,由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将所有的创建逻辑集中到一个工厂类中;它可以创建的类只能提前考虑。类,你需要改变工厂类。

当系统中具体的产品类别越来越多时,可能会要求工厂类别根据不同的情况创建不同的实例。这种条件判断和具体产品类型的判断相互交织,难以避免模块功能的扩散,非常不利于系统的维护和扩展;

这些缺点在工厂方法模式中得到了一定程度的解决。

3 工厂方法模式

工厂方法模式( ) 也称为工厂模式,也称为虚拟构造函数( ) 模式或多态工厂( ) 模式,属于类创建模式。

工厂方法模式是一种面向对象的设计模式,它实现了“工厂”的概念。像其他创建模式一样,它也处理创建对象而不指定它们的具体类型。

工厂方法模式的本质是“定义一个用于创建对象的接口,但让实现该接口的类决定实例化哪个类。工厂方法让类的实例化推迟到子类。”

工厂方法模式使用

虽然工厂方法模式和简单工厂模式都是通过工厂创建对象,但它们最大的区别在于工厂方法模式在设计上完全符合“开闭原则”。

工厂方法模式可用于以下情况:

如何实现工厂方法模式

工厂方法模式包括以下角色:

:抽象产品()

: 特定产品()

: 抽象工厂()

:()

关系图如下:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

这里也是一个计算器的例子。在保持 , , 等几个方法不变的情况下,修改简单工厂模式中的工厂类()。要替换原来的“通用”大工厂类,请改用工厂方法:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

这样,当你想在客户端进行加法操作时,需要如下方式:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

至此,一个工厂方法模式就写好了。

就代码量而言,这种工厂方法模式比简单工厂方法模式更复杂。不同的 () 类都有对应的工厂。很多人会有以下疑问:

看起来工厂方法模式比简单工厂模式复杂多了?

工厂方法模式与自己创建对象没有区别吗?为什么要建更多的工厂?

让我们更深入地了解一下针对上述两个问题的工厂方法模式。

为什么要使用工厂来创建对象?

创建封装对象的过程

在工厂方法模式中,工厂方法用于创建客户需要的产品,同时也向客户隐藏了将要实例化哪个特定产品类的细节。用户只需要关心所需产品对应的工厂,而不需要在不知道具体产品类的类名的情况下创建。

基于工厂角色和产品角色的多态设计是工厂方法模式的关键。它使工厂可以独立决定创建什么样的产品对象,如何创建这个对象的细节完全封装在特定的工厂内部。工厂方法模式也称为多态工厂模式,因为所有具体的工厂类都有相同的抽象父类。

为什么每种类型的对象都应该有一个单独的工厂?

遵守“开闭原则”

主要目的是为了解耦。向系统添加新产品时,不需要修改抽象工厂和抽象产品、客户端或其他具体工厂和具体产品提供的接口,只需要修改具体工厂和具体产品即可。添加。这样,系统的可扩展性就变得非常好,完全符合“开闭原则”。

这些就是工厂方法模式的优点。但是,工厂模式也有一些缺点:

工厂方法模式总结

工厂方法模式是对简单工厂模式的进一步抽象和概括。

由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,克服了它的缺点。

在工厂方法模式中,核心工厂类不再负责所有产品的创建,而是将具体的创建工作委托给子类。这个核心类只负责给出具体工厂必须实现的接口,而不是被实例化的产品类的细节,这使得工厂方法模式允许系统在不修改工厂角色的情况下引入新产品。

工厂方法模式的主要优点是在添加新的产品类时不需要修改现有系统,并且封装了产品对象的创建细节,系统具有很好的灵活性和可扩展性;工厂,这导致系统类的数量成对增加,在一定程度上增加了系统的复杂度。

4 抽象工厂模式

抽象工厂模式():提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式,也称为 Kit 模式,是一种对象创建模式。

抽象工厂模式提供了一种封装同一产品系列的各个工厂的方法。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后将抽象工厂作为接口来创建这个主体的具体对象。客户端程序不需要知道(或关心)它从这些内部工厂方法获得的对象的具体类型,因为客户端程序只使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与它们的一般用途分开。

产品系列

让我们了解一下什么是产品系列:位于不同产品层次结构中的功能相关产品系列。如下例,有两个产品家族:跑车家族和商务车家族。

关系图如下:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

抽象工厂模式的使用

抽象工厂模式和工厂方法模式一样,都遵循开闭原则。但不同的是,在工厂方法模式中添加特定产品时,必须添加相应的工厂。但是抽象工厂模式只需要在添加一个类型的具体产品时添加一个工厂。也就是说,工厂方法模式的工厂只能创建一个具体的产品。抽象工厂模式的工厂可以创建属于一个类型的各种具体产品。工厂创建的产品数量介于简单工厂模式和工厂方法模式之间。

抽象工厂模式可用于以下情况:

如何实现抽象工厂模式

抽象工厂模式包括以下角色:

(抽象工厂):用于声明生成抽象产品的方法

(具体工厂):实现抽象工厂声明的生成抽象产品的方法,生成一组具体产品。这些产品构成了一个产品家族,每个产品都位于一定的产品层次中;

(抽象产品):为每个产品声明一个接口,并在抽象产品中定义产品的抽象业务方法;

(具体产品):定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。

本文中的示例使用汽车铸造厂制造汽车的示例。假设我们是一家汽车铸造厂,我们负责为梅赛德斯-奔驰和特斯拉两家公司制造汽车。

我们简单把奔驰理解为需要加油的车,特斯拉理解为需要充电的车。其中,奔驰轿车包括跑车和商用车,特斯拉也包括奔驰轿车和商用车。

在上述场景中,我们可以分别对待跑车和商用车。有一个单独的跑车工厂和一个单独的商用车工厂。

这样以后我们就不需要把工厂给其他厂家造车了,只要是跑车或者商用车就行。同样,如果我们要添加不同类型的车辆,例如越野车,我们不需要修改跑车或商用车中的任何内容。

以下是抽象产品,梅赛德斯和特斯拉汽车:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

以下为具体产品,奔驰跑车、奔驰商用车、特斯拉跑车、特斯拉商用车:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

这是抽象工厂:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

以下是具体工厂:

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

“开闭原则”的倾向

“开闭原则”要求系统对扩展是开放的,对修改是封闭的,以达到通过扩展增强其功能的目的。对于涉及多个产品系列和多个产品层次结构的系统,增强功能包括两个方面:

抽象工厂模式的这种特性被称为“开闭原则”的倾向。抽象工厂模式支持以倾斜方式添加新产品。它有助于增加新的产品系列,但不能提供新的产品级别。结构的添加提供了这样的便利。

抽象工厂模式总结

抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式,也称为 Kit 模式,是一种对象创建模式。

抽象工厂模式是所有工厂模式中最抽象、最通用的形式。

抽象工厂模式的主要优点是它隔离了具体类的生成,这样客户就不需要知道创建了什么,而且每次可以通过具体的工厂类来创建一个产品族中的多个对象,方便添加或更换产品系列。添加新的混凝土工厂和产品系列非常方便;主要缺点是添加新的产品层次非常复杂,需要修改抽象工厂和所有具体工厂类,并且倾向于支持“开闭原则”。

5 三种工厂模式比较

简单工厂模式的优缺点

工厂方法模式的优缺点

抽象工厂模式的优缺点

三种工厂模式的比较与转换

你以为工厂模式很简单,可能是因为你懂的只是冰山的一角

简单工厂:用于生产同一层次结构中的任何产品。(添加新产品,主要是新产品,需要修改工厂类,符合单一职责原则,不符合开闭原则)

工厂方式:用于生产同一层次的固定产品。(支持添加任何产品。添加产品时,无需更改现有工厂,需要添加产品对应的工厂。符合单一职责原则,符合开放原则关闭。但是,它引入了复杂性)

抽象工厂:用于生产不同产品系列的所有产品。(添加新产品时需要修改工厂,添加产品族时需要添加工厂。符合单一职责原则,部分符合开闭原则,降低复杂度)

最后,三种工厂模式各有优缺点,没有最好,只有最适合!

郑重声明:本文版权归原作者所有,转载文章仅出于传播更多信息之目的。如作者信息标注有误,请尽快联系我们修改或删除,谢谢。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了