探索设计模式之二——工厂方法模式
2.工厂方法模式(Factory Method Pattern)
?
现实世界中,业务的本质是相对稳定的,而业务的具体实践则总会不断变化。在逻辑改变的时候,应当做到可以只替换具体实现类,而会不影响到代码的架构。开闭原则是OOAD中的核心原则,在实现功能需求的时候,新增的代码与修改的代码之间的比值,某种程度上可以作为量化衡量一个软件系统的成熟程度的标志。
定义创建者的抽象接口,延迟产品实例化到其子类之中,创建的产品一般不再通过传入参数控制,而直接决定于使用了哪个实现类作为其子类。
?
?
为了简单起见,本次阅兵需要检阅仅两种部队:从兵营生产出来的机枪兵以及从重工厂生产出来的坦克。无论从哪里生产出来,他们都是Terran的部队,实现了ITerranArmy接口,对于本次阅兵来说,此接口只有一个showState()方法。
?
图2.1 战斗部队及工厂的UML图
?值得指出的是,虽然示例代码中是直接通过new来创建具体工厂,但在现实编程中,大部分工厂方法模式都是配合这反射来使用的,既可以考虑把“SoldierFactory”、“MachineFactory”等具体实现类写在配置文件中,通过反射代替直接new一个具体工厂对象,这样当增加一个产品,就可以做到对工厂和使用者都不存在任何修改,只需要添加一个新的工厂类,并且配置到配置文件中即可,这就是开闭原则的一个体现。
?图 2.2 阅兵仪式运行结果通过上述阅兵的例子,我们看到工厂方法模式确实给系统架构带来强大而灵活的扩展能力。这种基于多态性设计的模式,使得产品的实例化延迟到具体子类之中,通过替换不同的实现子类就能达到新增和切换产品的目的。
?
?????? 由于本次阅兵效果良好,司令部决定让Raynor领导这些部队对Zerg进行一次大规模的协同作战。前面在简单工厂、工厂方法两种模式中,主要都是围绕这个体产品(Marine、Firebat、Tank等)的创建进行讨论,下一章中,我们将会通过一次“协同作战”看看各种具体对象之间存在互相依赖关系时,如何运用抽象工厂模式(Abstract Factory Pattern)来解决问题。
1 楼 IcyFenix 2010-01-19 PDF下载见附件,《设计模式探索——星际争霸探险之旅》其他章节请见我博客:
http://icyfenix.iteye.com 2 楼 litianyi520 2010-01-31 写的很好 ,但是例子举的不好,不够简洁 3 楼 yuur369 2012-03-18 工厂方法模式可以理解为在简单工厂的基础,对进行制造的工厂再做一层抽象的封装。由原先的单一工厂变成了现在任意个工厂。添加产品时不需对原来的工厂进行修改,只需添加一个新的工厂就行了。。。。。
