您的位置:首页 > 其它

学习笔记:设计模式之工厂模式

2013-01-29 23:40 267 查看
我目前正在做一个上传下载模版,上传下载功能要在一个类中实现,但两个的参数是明显不同的,所以要创建不同的实例,若使用构造函数创建上传类和下载类,感觉“表达”不是很清晰。于是我就想到用工厂模式在“类外”创建实例。这便是我学习工程模式的缘由,但是后来发现,这太大材小用了。毕竟工厂模式的真正精髓在于代码可重用性。

网上的却有很多优秀的文章,他们把工厂模式讲得很清楚,很明白(比如这篇文章:http://www.cnblogs.com/poissonnotes/archive/2010/12/01/1893871.html#2605935)。但是却很少有人说明工厂模式究竟有什么用。而本文的宗旨就在于此。

一般的,我们将工厂模式分为三类:简单工厂模式;工厂方法模式;抽象工厂模式。

简单工厂模式:将产品的抽象出来。其实现方式分三步:

第一步:提取公共因子----方法或属性,到”产品接口“(以接口或抽象类实现)。这里说个题外话,C#的接口中不可包含字段,但是可以使用属性,即有取值器和访问器。

第二步:创建产品类,基础并实现”产品接口“。

第三步:创建工厂。工厂提供一个create方法来生产产品。该方法接收一个参数,然后根据这个参数决定具体生产哪个产品,然后利用向上转型返回”产品接口“。

第四步:调用。

比如:我们现在有一个音乐播放器,将来可能还要做一个视频播放器。

1.把方法----播放,暂停,结束,快进,快退----抽取出来,放入媒体接口中。

2.创建音乐类,继承并实现媒体接口。

3.创建媒体工厂,接收一个字符串,当为音乐时,创建音乐类,返回媒体接口。否则抛出一个异常。

4.在音乐播放程序中使用媒体工厂实例化一个媒体接口,调用接口提供的方法。

OK,现在来看一下,将来做视频播放器时需要做的工作。

1.copy媒体接口

2.创建视频类,继承并实现媒体接口。

3.copy媒体工厂。

4.修改媒体工厂,添加一个判断,当参数为视频时,创建视频类,返回媒体接口。

5.copy音乐播放代码,将实例化时的参数该为视频。

现在工厂模式的作用很明显了,代码重用,只修改了少量的地方。

一个好的设计应该实现高内聚,低耦合。简单工厂模式每次都必须修改工厂类,这是不合理的。为了解决这个问题,工厂方法模式应运而生。

相对于简单工厂模式,工厂方法模式对工厂进行”提炼“,做出一个”工厂接口“(这儿推荐使用抽象类实现,毕竟接口不支持static方法)。

我们还是来看这个例子。

前两步与简单工厂模式相同,我们从第三步开始。

3.创建”媒体工厂接口“,规定返回值为媒体接口。

4.创建音乐工厂,继承并实现“媒体工厂接口”。

5.调用。

现在来看下,将来要做视频播放器所要做的工作。

1.copy媒体接口。

2.创建视频类,基础并实现媒体接口。

3.copy“媒体工厂接口”。

4.创建视频工厂,继承并实现“媒体工厂接口”。

5.copy音乐播放器代码,修改,将实例化工厂接口所用的类换为视频工厂。

可以很明显的看出,视频播放器重用了音乐播放器的代码,而且又很好的分离了出来,互不影响。

那么,抽象工厂模式又是什么呢?

它不过多一个层级关系而已,一个工厂可以生产多个互有关联产品。说到底还是可以用简单工厂或工厂方法模式来实现。但是做为好的设计,我们还是应该以工厂方法模式来实现,即将这个可以生产多个产品的工厂再次“提取”,做出一个“接口”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: