抽象工厂模式的好处

本文探讨了设计模式中的抽象工厂模式,并对比了工厂方法等其他模式。通过实例解释了何时及如何使用抽象工厂模式,以及它如何简化对象创建过程。

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

抽象工厂模式的好处

本来在写一篇设计模式的体会的文章,不过这个礼拜忙于补习编译原理了,先写一点零碎的吧。
事先申明,以下内容只是我个人的体会,不保证正确,全面以及合理。
--------
在GOF的数量,创建型模式有好几个,最最常用的是工厂方法,简单的描述:
你需要创建很多对象,比如矩形,圆形,圆角矩形(也许这是一个组态软件,或者Visio)。
你可以随地来new,但是稍有经验的人就会选择由一个专门的方法来负责创建对象。如:
CDrawObj* CreateDrawObj(int ObjType)
这样做的好处是显而易见的:
1.代码集中了
2.如果修改了CreateDrawObj函数,可以不影响外部代码。比如CRectDrawObj被认为有问题,有人写了个新
类CRectDrawObjEx,那只要修改CreateDrawObj,就可以神不知鬼不觉地换掉了。

以上的例子,假设我们明白虚函数的概念,CDrawObj就是这么一个虚基类。(C#里更愿意抽象为Interface)

好,现在的代码的情况是:
有一个CreateDrawObj函数,然后其它地方到处散布着对这个函数的调用。
如果现在我有了整个一大套新的DrawObj,而且希望在运行的时刻,可以在两套DrawObj之间切换。
很直观的做法,给CreateDrawObj加一个参数: CDrawObj* CreateDrawObj(int ObjType,int Category)
其实这个办法也挺好的。

不过OO里不太喜欢这一套,我们喜欢把变数封装到对象内部,所以以上函数就变成了两个:
CFactory* CreateFactory(int FactoryType)
CFactory::CreateDrawObj(int ObjType)

这样,当我们希望整个更换DrawObj家族的时候,只要在CreateFactory的时候产生一个不同的工厂就可以了,
其它所有地方不需要修改。而使用 CDrawObj* CreateDrawObj(int ObjType,int Category) 的方式,在每个调用
CreateDrawObj的地方,都要根据情况传入不同的Category参数。

把变数封装到对象中,这是面向对象设计的一个小伎俩。

不知道说清楚了没有。

说实话,抽象工厂用的地方并不是很多,更常见的是工厂方法加模版方法的组合,这在框架设计中比较常用。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值