学习笔记:设计模式之工厂模式
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音乐播放器代码,修改,将实例化工厂接口所用的类换为视频工厂。
可以很明显的看出,视频播放器重用了音乐播放器的代码,而且又很好的分离了出来,互不影响。
那么,抽象工厂模式又是什么呢?
它不过多一个层级关系而已,一个工厂可以生产多个互有关联产品。说到底还是可以用简单工厂或工厂方法模式来实现。但是做为好的设计,我们还是应该以工厂方法模式来实现,即将这个可以生产多个产品的工厂再次“提取”,做出一个“接口”。
网上的却有很多优秀的文章,他们把工厂模式讲得很清楚,很明白(比如这篇文章: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音乐播放器代码,修改,将实例化工厂接口所用的类换为视频工厂。
可以很明显的看出,视频播放器重用了音乐播放器的代码,而且又很好的分离了出来,互不影响。
那么,抽象工厂模式又是什么呢?
它不过多一个层级关系而已,一个工厂可以生产多个互有关联产品。说到底还是可以用简单工厂或工厂方法模式来实现。但是做为好的设计,我们还是应该以工厂方法模式来实现,即将这个可以生产多个产品的工厂再次“提取”,做出一个“接口”。
相关文章推荐
- Java-马士兵设计模式学习笔记-工厂模式-简单工厂
- 设计模式学习笔记(7):工厂模式(3)
- 15. JAVA 反射机制 Part 2(动态代理、类的生命周期、工厂设计模式) ----- 学习笔记
- 设计模式学习笔记(三)--工厂模式
- 设计模式学习笔记(四)之工厂模式(Factory)
- 设计模式学习笔记(五):工厂方法模式
- 设计模式学习笔记之(一、工厂模式)
- java设计模式学习笔记--简单工厂模式
- 设计模式学习笔记二-(简单工厂)
- 设计模式学习笔记(一):抽象工厂
- 设计模式学习笔记(6):工厂模式(2)
- 【设计模式】学习笔记5:工厂模式(Factory Method)
- 设计模式学习笔记四:工厂方法(Factory Method)
- 设计模式学习笔记(四)之工厂模式(Factory)
- 设计模式学习笔记-简单工厂模式
- C++设计模式学习笔记一:简单工厂模式
- 设计模式学习笔记----工厂模式
- 设计模式学习笔记(一):抽象工厂
- 设计模式学习笔记:factory method(工厂方法)
- C#面向对象设计模式纵横谈 学习笔记3 Abstract Factory 抽象工厂