扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:LoveCherry 来源:博客园 2007年11月19日
关键字:
代码说明
这个代码基于前一节抽象工厂的代码修改而来,因此代码比较厂。其中能体现的设计模式有抽象工厂、工厂方法以及模版方法。
这次的PatrixSceneFactory和前一节的不同,它是一个产品的抽象工厂,也就是工厂方法模式中的抽象工厂角色,它是具体产品工厂的抽象形式。
HalfPaperFactory和MatrixFactory是工厂方法模式中的具体工厂角色,它负责创建具体的产品。
PatrixScene是工厂方法模式中的抽象产品角色,同时也是抽象工厂模式中的抽象工厂角色。它既是场景的抽象形式,又负责创建每个场景中的产品系列,也就是模型和纹理。还有,它的InistScene()方法还体现了模版方法的思想,封装了产品初始化过程中的共同步骤。
HalfPaper和Matrix当然就是工厂方法模式中的具体产品角色了,同时,它们也是抽象工厂模式中的具体工厂角色。
从这个例子可以看出,抽象工厂针对一组产品的创建进行抽象,抽象程度比较高。抽象工厂生产重点在于规范一组产品的创建,能让产品线保持产品的一致。比如,N卡不管是7系列还是8系列,总会分低端的7300,8300和中端的7600,8600以及高端的7900,8900。
而工厂方法针对某种产品的创建,每种产品在创建的过程中可能会有一些相似的步骤,那么就可以在抽象产品中进行一些提取,自然而然运用到了模版方法。工厂方法还能针对具体产品创建时的易变性,在这里我们可能很清楚HalfPaperFactory一定会创建HalfPaper这个产品,但是万一以后改为创建HalfPaperSpecial了呢?有了工厂方法,我们可以只需修改HalfPaperFactory就可以了。
不管怎么样,目的还是让调用方尽量和接口依赖(或者说和稳定的东西去依赖,让变化在接口下面变),既是要以来具体类型,也希望能只依赖一个。试想一下,如果没有抽象工厂和工厂方法,也少了这些抽象类型,那么调用方可能就要依赖具体场景类型和具体的纹理以及模型类型。并且在调用的时候,通过条件来判断并且创建各种具体类型,一旦有新的场景需要实现,调用方代码可能就需要做很大的调整。暂且不说调整的工作量有多少,调整所带来的风险谁能承担呢?
何时采用
从代码角度来说, 如果我们需要创建一个易变的对象,或是希望对象由子类决定创建哪个对象的时候可以考虑工厂方法。
从应用角度来说, 如果我们觉得具体产品的创建不稳定,或者客户端根本无需知道创建哪个具体产品的时候可以使用工厂方法。后者对于框架和工具包软件来说更常见,比如有一个打印类负责打印图纸,我们需要得到一个打印对象,对于调用方来说并不知道要使用超宽打印对象还是普通打印对象,我们可以通过工厂方法使客户端和抽象打印工厂直接沟通,由它来决定具体创建哪个打印对象。
实现要点
通过继承创建具体产品。很多时候,每一种具体产品对应一个具体的工厂来创建。
使用具体工厂类来决定怎么样创建具体产品。调用方并不关心工厂创建的是哪个游戏场景,它只用知道工厂给我的是一个游戏场景即可。
注意事项
工厂方法通常需要为每个具体产品对应一个具体工厂,如果滥用的话会使得类的数目急剧增多。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者