答案: 3. 问题是什么?
对于不熟悉这个模式的人都会对工厂(Factory)这个词感到奇怪,为什么会用这个词?之后,我们还会碰到另一个模式——工厂方法(Factory method),所以先解释一下工厂的意义:
房子是由墙,门,窗户,地板,天花板,柱子组成的。如果我们为客户编写一个建造房子的软件,我们会把墙,门,窗户,地板,天花板,柱子看成不同的类:WallClass, DoorClass, WindowClass, CeilingClass, PillarClass。
现在我们建立一个新类A,这个类中有CreateWall(), CreateDoor(), CreateFloor(), CreateCeiling(), CreatePillar()五个方法,每个方法的功能就是创建并返回相应的对象。如果把WallClass, DoorClass, WindowClass, CeilingClass, FloorClass, PillarClass的实例看成产品的话,那么类A就像是一个生产这些产品的工厂。这就是使用工厂这个词的原因。
Tips:A这个名字太糟,如果用HouseFactory会好一些。一般情况下,在你的系统使用某个模式,最好使用模式相应的关键字作为类或者方法的名字的一部分,这样,你的同伴或者系统的代码维护者就会明白你的用意。
我们的软件完成了,客户非常满意。不过,我们的客户想把这个软件出口,他发现一个问题,这个软件太本地化了,建造出来的都是中国式的房屋。因此他希望我们的软件能够建造出不同地域风格的房子。
这就是我们的问题!我们需要重新设计原系统,而且一次完成世界各地不同建筑风格是不可能的。我们会先完成部分风格(客户第一要投放软件的国家的),然后再增加其他的…
4. 解决方法
1) 建立一个抽象工厂(Abstract Factory)类HouseFactory,在这个类中声明: CreateWall ()
CreateDoor ()
CreateFloor ()
CreateCeiling ()
CreatePillar ()
2) 建立相应的抽象产品(Abstract Product)类集:
Wall, Door, Floor, Ceiling, Pillar
3) 为不同风格建立相应的具体工厂(Concrete Factory)类(不要忘了实现关系),例如: ChinaHouseFactory : HouseFactory
GreeceHouseFactory : HouseFactory
…
4) 为不同的风格建立相应的具体产品(Concrete Product)类(实现相应的抽象产品),例如: ChinaWall : Wall
ChinaDoor : Door
…
GreeceWall : Wall
GreeceDoor : Door
…
5. 杂谈
我想你一定明白如何灵活的创建和使用上面的一大堆类: ● 重复最后两个步骤,就可以方便的增加新风格;
● 使用前面两个步骤中声明的抽象类来实现操作。
抽象工厂模式的重点不是声明的那个抽象工厂类,而是它声明的一系列抽象产品类,我们通过使用这些抽象产品类可以操作我们已经实现或者还未实现的具体产品类,并且保证了它们的一致性。
你可能已经发现这个软件不能建造你的两层别墅,因为它没有楼梯。为此,我们要定义Stair抽象类,还要增加CreateStair抽象方法;最重要的是我们要在已经完成的76种风格中增加相应的Stair类,这可是个易做图烦。确实,抽象工厂模式在适应新的产品方面的能力是比较弱的。这是它的一个缺点。
[font color=red]本文未经作者同意,严禁转载,违者必究![/font]
关于作者:
杨宁是GrapeCity公司海外应用开发部技术骨干。从事多年的程序开发,有Unix,Windows平台上的开发经验。对VB,C#, VB.Net,XML有比较丰富的认识。喜爱研究OO的编程,分析,设计,项目管理等相关技术。喜欢学习新的技术。
上一个:了解AOP
下一个:SOA实践