C++:浅谈工厂模式与抽象工厂模式

本文浅谈C++中的工厂模式和抽象工厂模式,通过实例解释两者的区别和应用场景。工厂模式提供了一种创建对象的方式,而抽象工厂模式则扩展到创建相关对象家族。文章还讨论了两种模式的优缺点,并给出了一个使用抽象工厂模式解决跨平台图形编程任务的案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++:浅谈工厂模式与抽象工厂模式

标签: C++ 工厂模式 抽象工厂模式

by 小威威


之前写过一篇谈模式的文章:单例模式

接下来我将浅显的谈谈工厂模式抽象工厂模式

工厂模式抽象工厂模式虽有差异,但实现的目的可以看成一致的:

They offers the interface for creating a family of related objects, without explicitly specifying their classes.
它们给一系列有联系的对象提供了创建的接口,而不用显式地明确类名。

接下来我来通过两张图,进一步了解这两种模式的原理与差异。

1.工厂模式

工厂模式

这张图就是工厂模式的原理。希望读者能以实际生活中的工厂来了解这张图。

首先,我们可以把ProductFactory想象成生产某种产品(抽象类产品)的某类工厂(抽象类工厂),这个抽象类工厂演变出许多实例化对象,也就是实际的工厂:ConcreteProductFactoryA,ConcreteProductFactoryB。这两个实例化工厂生产的内容与抽象工厂定义的内容一致,即包含一个抽象类product。

然后,如上文所讲,Product是某种产品(抽象类产品),它也能演变出许多实例化对象:ConcreteProductA,ConcreteProductB。也就是上面的实例化工厂都能生产A、B两种产品。

举个例子:
现在有生产水果罐头的工厂(抽象类工厂):工厂1(工厂实例化对象),工厂2(工厂实例化对象)。这两个工厂都生产着水果罐头(抽象类产品) : 水蜜桃罐头(产品实例化对象),哈密瓜罐头(产品实例化对象),苹果罐头(产品实例化对象)。

这样讲就形象多了吧。

2.抽象工厂模式

抽象工厂模式

这张图就是抽象工厂模式的原理。希望读者能以实际生活中的工厂来了解这张图。

首先,我们可以把AbstractFactory看作是一类能够生产多种产品的工厂(抽象类工厂),这个工厂演变出许多实例化对象,也就是ConcreteFactory1(工厂实例化对象)和ConcretrFactory2(工厂实例化对象)。这两个实例化工厂生产的内容与抽象工厂定义的内容一致,即为AbstractProductA(抽象类产品),AbstractProductB(抽象类产品)。

然后AbstractProductA,AbstractProductB也能分别演变出许多实例化对象:如AbstractProductA可演变成ProductA1(产品实例化对象),ProductA2(产品实例化对象),AbstractProductB可演变成ProductB1(产品实例化对象), ProductB2(产品实例化对象)。

举个例子:
现在有生产水果罐头和肉类罐头的工厂(抽象类工厂):工厂1(工厂实例化对象),工厂2(工厂实例化对象)。这两个工厂都生产着水果罐头(抽象类产品),肉类罐头(抽象类产品)。水果罐头的种类有:水蜜桃罐头(产品实例化对象),苹果罐头(产品实例化对象),肉类罐头的种类有:牛肉罐头(产品实例化对象),猪肉罐头(产品实例化对象)。

文章推荐:抽象工厂模式C++实现

3.两种模式的差异

工厂模式
只有一个抽象工厂,能生成许多实例化工厂。
只有一个抽象产品,能生成许多实例化产品。
也就是说,工厂模式下,抽象工厂内只有一种抽象类产品,即这类工厂只能生产一类产品。

抽象工厂模式
只有一个抽象工厂,能生成许多实例化工厂。
拥有多个抽象类产品,每个抽象类产品能生成许多实例化产品。
也就是说,抽象工厂模式下,抽象工厂内有多种抽象类产品,即这类工厂能生产多类产品。

由此可以发现他们之间的差异。

4.工厂模式的优缺点

当接触到这个模式的时候,必然会有人问:“这种模式有什么优点?我为什么要用这种模式?”

当然,模式的使用也要依情况而定。有时候方便有时候也会带来麻烦。

如我们现在我们定义一个派生类作为原来的类的补充,即是要用派生类来替换基类。这种情况下,显然工厂模式修改代码较为方便。原因是:工厂模式下,具体调用者不负责创建对象,并且创建对象返回的是接口类型,因此当要修改时,只需修改工厂,而无需全盘修改。但是小程序就不一样了,有很多地方需要修改。

但是,如果是要增加类的方法,那么工厂模式便会非常复杂。首先他要在抽象类中补充方法,其次还要在这个抽象类的所有派生类中补充方法。这是非常麻烦的,尤其是工程较大的时候。小程序就不一样了,此时它只需直接在类中增加方法即可。

5.例题

Assignment

This time we are going to use Abstract Factory to finish this problem.

We have a multi-platform support Graphic programming task that need some widgets of different platform tools.

For example, in Microsoft Windows, we use MFC to produce window widgets.

We are going to design how to use Abstract Factory to finish this job.

Please analyze the main function and then download the executable binary program to meet you result.

Client.cpp已给出:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值