首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

解读设计方式-简单工厂模式(SimpleFactory Pattern)

2012-06-29 
解读设计模式----简单工厂模式(SimpleFactory Pattern)一、模式概述???? 从设计模式的类型上来说,简单工厂

解读设计模式----简单工厂模式(SimpleFactory Pattern)

一、模式概述
???? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现,学习了此模式可以为后面的很多中模式打下基础。那好,我们就来了解下什么是简单工厂模式?

???? 我们来分析一个现实生活中的案例,每天早晨起床洗唰后是干什么呢?吃早餐(这里只针对在外吃早餐的上班族)、坐车(我是穷人只有坐公交,当然很多有钱人都自己有车,这里不考虑这些)去公司上班、是这样的吗?OK,下面就来分析下吃早餐中的故事,大家先看看下面这个图:
? ? ? ? ? ? ? ? ? ? ??解读设计方式-简单工厂模式(SimpleFactory Pattern)
???? 当我们在买早餐的时候,早餐店里都卖得写什么呢?这点你有注意吗?众多食品摆在那里,你只对营业员说你要何种食品,他便会知道给你拿什么样的食品给你,这说明什么呢?如果用面向对象的思想来理解的话,营业员在这里就充当了一个工厂的角色,他负责根据你的请求返回你需要的食品对象。而这一点正是简单工厂模式的意图。

二、模式意图
???? 简单工厂模式根据提供给他的数据,返回几个可能类中的一个类的实例。

三、模式UML图????
???? 下面是简单工厂模式的示意性UML图:

解读设计方式-简单工厂模式(SimpleFactory Pattern)
????????????????
???? 如上图,简单工厂模式UML我画了两种,详细如下:
???? ① 只有一个产品对象的简单工厂模式。
???? ② 带有一个抽象产品对象的简单工厂模式。

四、模式参与者
????? 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象。
????? 抽象产品(AbstractProduct)角色: 是工厂模式所创建对象的父类或是共同拥有的接口。可是抽象类或接口。
????? 具体产品(ConcreteProduct)对象:工厂模式所创建的对象都是这个角色的实例。

五、模式实现
???? 我们通过上面的分析,已经清晰的知道了工厂模式中的各种角色和职责,那工厂模式通过代码是怎么实现的呢?OK,下面将继续分析上面的吃早餐中的故事,做一个简单的示例实现。
???? 1、首先我们来看看只有一个产品对象的简单工厂模式的实现。其实这很好理解,就当店里只卖一种食品,这里以馒头为例。



???? 2、带抽象产品(AbstractProduct)角色的简单工厂模式实现
???? 从上面分析中得知,这种实现得为每一种产品创建一个静态方法来完成产品对象的创建。虽然带有简单工厂的性质,但是又好象不能够完全体现出简单工厂模式的意图。简单工厂的意图是:根据提供给他的数据,返回几个可能类中的一个类的实例。根据意图出发进行分析,要实现完全满足简单工厂模式意图的程序,也就得根据提供给工厂的数据,让工厂根据这个数据来进行判断,然后返回相应的对象。OK,看看是下面这样的吗?
?????????????????????????
???? 示意性代码如下:


??????????????????????????????????????
???? 在实际的开发中,这种演化是很适用的,可以说是一种编程技巧吧。

???? 4、模式的其他演变
???? 如果系统中只有唯一的一个具体产品对象,那么可以省略抽象产品角色。这一种其实也就是本钱前面的第一种模式实现。
???? 如果抽象产品角色省略,那么工厂角色就可以与具体产品角色合并。也就是说一个产品类就是自身的工厂。这样把原有三个独立的角色:抽象产品角色、具体产品角色和工厂角色合并为一个,这个类自己负责创建自己的实例。

???? 注:以上演变可以从上面的程序代码中直接修改而来,这里我就不贴代码了。??

六、模式优缺点
????? 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
????? 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
????? 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

七、相关模式
????? 工厂方法模式:每个产品由一个专门的工厂来负责创建。是一种只有唯一一个产品的实现,带有简单工厂的性质。
????? 抽象工厂模式:大致和工厂方法相同。
????? 单例模式:单例的实现和上面模式演变中的最后一种很相似,只要把构造器私有便OK。

八、参考资料
???? Addison-Wesley,1995,p.185. 中文版:《设计模式:可复用的面向对象软件的基础》 李英军等译.
???? Alan Sharroway & James r.Trott.中文版:《设计模式精解
???? 张逸? 著《软件设计精要与模式》

?

热点排行