登陆注册
8183300000114

第114章 7 简单工厂模式与工厂方法模式大。

小A:“什么是简单工厂模式?”

大B:“简单工厂模式又叫静态工厂模式,顾名思义,它是用来实例化目标类的静态类。”

小A:“简单工厂模式有什么优点?”

大B:“现在我就主要通过一个简单的实例说明简单工厂及其优点。”

小A:“嗯。好。”

大B:“就如刚才我讲过的,有个国家的运动员协会。”

下面给出各个类的程序。

Code:[Copy to clipboard]

运动员。java

public interface 运动员{

public void 跑();

public void 跳();

}

足球运动员。java

public class 足球运动员implements 运动员{

public void 跑(){

//跑啊跑

}

public void 跳(){

//跳啊跳

}

}

篮球运动员。java

public class 篮球运动员implements 运动员{

public void 跑(){

//do nothing

}

public void 跳(){

//do nothing

}

}

体育协会。java

public class 体育协会{

public static 运动员 注册足球运动员(){

return new 足球运动员();

}

public static 运动员 注册篮球运动员(){

return new 篮球运动员();

}

}

俱乐部。java

public class 俱乐部{

private 运动员 守门员;

private 运动员 后卫;

private 运动员 前锋;

public void test(){

this 前锋=体育协会,注册足球运动员();

this 后卫=体育协会,注册足球运动员();

this 守门员=体育协会,注册足球运动员();

守门员,跑();

后卫,跳();

}

}

大B:“这就是简单工厂模式的一个简单实例,你应该想象不用接口不用工厂而把具体类暴露给客户端的那种混乱情形吧?就好像没了体育总局,各个俱乐部在市场上自己胡乱的寻找仔细需要的运动员。简单工厂就解决了这种混乱。我们用OCP看看简单工厂,会发现如果要对系统进行扩展的话治需要增加实现产品接口的产品类(上例表现为‘足球运动员’,‘篮球运动员’类,比如要增加个‘乒乓球运动员’类),而无需对原有的产品类进行修改。”

小A:“这咋一看好像满足OCP。”

大B:“但是实际上还是需要修改代码的――对,就是修改工厂类。上例中如果增加‘乒乓球运动员’产品类,就必须相应的修改‘体育协会’工厂类,增加个‘注册乒乓球运动员’方法。所以可以看出,简单工厂模式是不满足OCP的。”

小A:“那工厂方法模式哩?”

大B:“我们刚刚讲了简单工厂模式,下面继续谈谈工厂方法模式。刚才点明了简单工厂模式最大的缺点――不完全满足OCP。为了解决这一缺点,设计师们提出了工厂方法模式。工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。下面我们通过修改刚才的实例来介绍工厂方法模式。我们在不改变产品类(‘足球运动员’类和‘篮球运动员’类)的情况下,修改下工厂类的结构。”

相关代码如下:

Code:[Copy to clipboard]

运动员。java

public interface 运动员{

public void 跑();

public void 跳();

}

足球运动员。java

public class 足球运动员implements 运动员{

public void 跑(){

//跑啊跑

}

public void 跳(){

//跳啊跳

}

}

篮球运动员。java

public class 篮球运动员implements 运动员{

public void 跑(){

//do nothing

}

public void 跳(){

//do nothing

}

}

体育协会。java

public interface 体育协会{

public 运动员 注册();

}

足球协会。java

public class 足球协会implements 体育协会{

public 运动员 注册(){

return new 足球运动员();

}

}

篮球协会。java

public class 篮球协会implements 体育协会{

public 运动员 注册(){

return new 篮球运动员();

}

}

俱乐部。java

public class 俱乐部{

private 运动员 守门员;

private 运动员 后卫;

private 运动员 前锋;

public void test(){

体育协会 中国足协=new 足球协会();

this。前锋=中国足协,注册();

this。后卫=中国足协,注册();

守门员,跑();

后卫,跳();

}

}

大B:“很明显可以看到,‘体育协会’工厂类变成了‘体育协会’接口,而实现此接口的分别是‘足球协会’‘篮球协会’等等具体的工厂类。”

小A:“这样做有什么好处呢?”

大B:“很明显,这样做就完全OCP了。如果需要再加入(或扩展)产品类(比如加多个‘乒乓球运动员’)的话就不再需要修改工厂类了,而只需相应的再添加一个实现了工厂接口(‘体育协会’接口)的具体工厂类。”

小A:“工厂方法模式是为了克服简单工厂模式的缺点(主要是为了满足OCP)而设计出来的。但是,工厂方法模式就一定比简单工厂模式好呢?”

大B:“不一定。1、结构复杂度。从这个角度比较,显然简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。2、代码复杂度。代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。3、客户端编程难度。工厂方法模式虽然在工厂类结构中引入了接口从而满足了OCP,但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式的工厂类是个静态类,在客户端无需实例化,这无疑是个吸引人的优点。4、管理上的难度。这是个关键的问题。我们先谈扩展。众所周知,工厂方法模式完全满足OCP,即它有非常良好的扩展性。”

小A:“那是否就说明了简单工厂模式就没有扩展性呢?”

大B:“不是的。简单工厂模式同样具备良好的扩展性――扩展的时候仅需要修改少量的代码(修改工厂类的代码)就可以满足扩展性的要求了。尽管这没有完全满足OCP,但不需要太拘泥于设计理论,要知道,sun提供的java官方工具包中也有好多没有满足OCP的例子啊(java。util。Calendar这个抽象类就不满足OCP)。然后我们从维护性的角度分析下。假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦(对号入座已经是个问题了)。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类。”

同类推荐
  • 如何处理电脑故障

    如何处理电脑故障

    本书以问答的方式介绍了电脑会出现的各种故障,内容包括了音箱声音失真,如何处理?如何做好电脑的日常维护等等问题。
  • 下一代互联网

    下一代互联网

    本书系统介绍了下一代互联网的进展情况,包括下一代互联网的概念解析,国内外下一代互联网的最新发展情况,下一代互联网的关键技术进展,以及各国发展下一代互联网的政策计划。最后分析了下一代互联网对未来社会的影响,提出我国发展下一代互联网的政策建议等。全书共6章,包括互联网发展历史和现状,下一代互联网基本概念,下一代互联网研究最新进展,下一代互联网发展现状,我国发展下一代互联网现状,发展下一代互联网战略建议。
  • 组态软件控制技术

    组态软件控制技术

    监控组态软件是完成数据采集与过程控制的专用软件,它以计算机为基本工具,为实施数据采集、过程监控、生产控制提供了基础平台和开发环境。本书从应用角度出发,详细介绍了组态软件应用程序的开发过程。对窗口界面编辑、动画链接、实时和历史趋势、安全机制、I/O设备连接,以及生产应用等内容都做了非常详细的介绍。MCGS是优秀的监控组态软件之一,它功能强大、使用方便,可以非常容易地实现监视、控制、管理的各项功能,并可提供软、硬件的全部接口,方便、快速地进行系统集成,构成不同需求的数据采集与监控系统。本书可作为高等学校计算机应用、自动控制、电子技术、机电技术专业的教材,同时还可作为相关专业工程技术人员的自学用书。
  • 悟道:一位IT高管20年的职场心经

    悟道:一位IT高管20年的职场心经

    本书是一位有20多年职场经验的IT企业高管撰写的一系列有关职场悟道的短文集成,讲述的是在企业里如何修炼自己,如何摆平自己的心态,怎样做到“世事洞明”和“人情练达”,如何“搞定老板”,怎样做到工作和生活平衡等诸多话题,涉及到跳槽、转行、升迁、环境、沟通、老板、下属、老外等等。每一篇都以作者的亲身经历或者身边的故事说明道理,语言简洁流畅,妙趣横生,更有不少经典片段和发人深省的职场警句,读起来就像是一个睿智幽默的老朋友坐在你面前娓娓道来。
  • 纵横于天地之间——互联网络技术

    纵横于天地之间——互联网络技术

    本书告诉你:不管你是谁,只要生活在当前的时代,你一定知道电话,知道电脑,知道上网……知道许许多多关于电子、关于计算机、关于网络的话题,这就是网络时代。网络的话题可多了:它是怎么来的?什么是“蜘蛛网”?网络的过去和现在,上网的方法,如何使用网络,互联网的安全,网络有“陷阱”吗?网络有“瘾”吗?网络文化和未来又是怎样的?到书中去找答案吧!
热门推荐
  • 甜宠来袭:名门总裁好孕妻

    甜宠来袭:名门总裁好孕妻

    苏可歆只想嫁给一个普通男人,可谁能告诉她,为什么她莫名其妙地成了总裁夫人?他许她一世,宠她入骨,待她如宝。她以为,这或许就是幸福了吧,可他突然将一沓纸丢在她面前——“苏可歆,我们离婚吧。”她终于明白,什么叫做从云端跌落,粉身碎骨。五年后,她归来,与他重逢,身边却是多了只萌萌哒小包子。小包子看着眼前的男人,眨巴眨巴眼睛。“妈咪,这个叔叔长得跟我好像,难道他也是妈咪生的么?”--情节虚构,请勿模仿
  • 生死道途

    生死道途

    火凤之体遭天道压迫,一个身具火凤之体少年因此而沉寂,武修之路难有进步。一次被人拿来炼丹的途中,他经历生死,觉醒火凤血脉。强大的火凤血脉连天道都要压迫,其力量会有何等的恐怖?血脉觉醒,他的武修路途又将如何?
  • 平洲诡事

    平洲诡事

    田飞本是一名普通的小民警,直到有一天管辖的小镇出现命案
  • 佛说顶生王故事经

    佛说顶生王故事经

    本书为公版书,为不受著作权法限制的作家、艺术家及其它人士发布的作品,供广大读者阅读交流。
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 解三国

    解三国

    穿越到三国的陆逸,获得了神秘的系统buff,可以兑换盖天武将,可以兑换美女,甚至还有着黑科技可以用来兑换,逆天系统,安天下!
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 亡灵侍从

    亡灵侍从

    被害身死,灵魂误入妖兽洞穴;迫于无奈,成为猫女贴身护卫;矛盾重重,人妖之争火热开战;爱与正义,最终将会如何抉择?
  • 丹道剑神

    丹道剑神

    修炼一途,聚源气,凝元丹,开天府,建星河,看破生死轮回,成就至尊,方可成神,神之上,即为主神,主神看破虚无红尘,即为神王。本文讲述的是主角星尘如何一步步的,超过众多神王,一步步的登顶,宇宙掌控者的。
  • 校草放过我

    校草放过我

    维可馨,初中毕业生,6岁母亲去世,父亲再婚,和继母继妹生活,父亲常期在外,天天被继母继妹使唤,为了自己高中的生活费在奶茶店打工,有一天回家的路上,她的自行车撞上了要去酒吧的韩梦漪