网站首页

家园论坛

老版论坛

家园博客

业界新闻

技术文档

下载中心

速查中心

图片中心

硬件资讯
上一篇:无废话C#设计模式之二:Singleton 下一篇:无废话C#设计模式之四:Factory Method
无废话C#设计模式之三:Abstract Factory

来源: 作者: 添加日期:2007-12-2 10:25:47 点击次数:

代码执行结果如下图:

 

 

代码说明

 

l         PatrixSceneFactory就是一个抽象工厂,它声明了创建抽象的场景以及抽象的纹理的接口。(广告时间:Patrix是我公司的一款休闲FPS游戏,详细请见http://www.qwd1.com

l         ModelTexture是抽象产品。在Model类中有一个抽象方法,用于为模型填充纹理。

l         HalfPaperMatrix是具体工厂,它用于创建某个场景的模型和纹理。(你可能对两个类的名字不太理解,其实HalfPaperMatrix是两个地图的名字)

l         xxxModelxxxTexture就是具体的产品了。它们就是针对某个场景的模型和纹理,具体工厂负责创建它们。

l         Patrix这个类负责加载场景,为了避免加载不同场景使用case语句,在这里我们使用反射来加载具体工厂类。

l         可以看到,一旦有了新的场景(或者说地图),我们只需要设计新的xxxModelxxxTexture以及具体工厂类就可以了,加载场景的那部分代码(也就是Patrix类)不需要做改动。

l         我们现在这个游戏可是不支持和电脑对战的,万一以后需要支持电脑了,那么场景中的元素除了纹理和模型之外就还需要加电脑了。也就是说抽象工厂还需要多生产一种类型的产品,这个时候抽象工厂就无能为力了。抽象工厂只能解决系列产品扩张的变化点(在我们的例子中就是地图的新增),因此千万把抽象工厂所能生产的产品考虑周全了。

 

何时采用

 

l         从代码角度来说,你希望在统一的地方创建一系列相互关联的对象,并且基于抽象对象的时候。

l         从应用角度来说,如果你的产品是成组成套的,并且肯定会不断扩展新系列的,那么就适用抽象工厂。比如说,外面买的塑料模型,里面总是有图纸、模型元件板和外壳包装三部分。那么生产模型的厂就是抽象工厂,打印图纸、打印包装盒以及生产元件板的三个流水线就是具体工厂了。需要生产新的模型,只需要制作新的图纸输入到三个流水线的电脑中就可以了。

 

实现要点

 

l         抽象工厂本身不负责创建产品,产品最终还是由具体工厂来创建的。比如,MatrixModelMatrix创建的,而不是PatrixSceneFactory创建的。在.NET中可以使用反射来创建具体工厂,从而使得代码变动降到最低。

l         在抽象工厂中需要体现出生产一系列产品。这一系列产品是相互关联,相互依赖一起使用的。

l         抽象工厂对应抽象产品,具体工厂对应具体产品,外部依赖抽象类型,这样对于新系列产品的创建,外部唯一依赖的就是具体工厂的创建过程(可以通过反射解决)。

 

注意事项

 

l         一般来说需要创建一系列对象的时候才考虑抽象工厂。比如,创建一个场景,需要创建模型和纹理,并且模型和纹理之间是有一定联系的,不太可能把PatrixTexture套用在MatrixModel上。

l         如果系统的变化点不在新系列的扩充上,那么就没有必要使用抽象工厂。比如,如果我们不会增加新地图的话,那么也就没有必要引入抽象工厂。

 

.NET中的抽象工厂

本新闻共3页,当前在第2页  1  2  3  

 
设为首页 | 加入收藏 | 业务办理 | 友情链接 | 论坛版面 | 浙ICP备07502118号 |