




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、时间:2009-08-04 17:23来源:未知作者:和水柔石核心提示:作者:和水柔石 一、引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz (奔驰)、Bmw (宝马)、Audi(奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车不过,爆发户坐车时总是这样: 上Benz车后跟司机说 开话说十年前,有一个爆发户,他家有三辆汽车( Benz (奔驰)Bmw (宝马)、Audi (奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!,坐上Bmw后他说开宝马车!,坐上Audi后他说开奥迪车!你一定说:这人有病!直接说开车
2、不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是,这种有病的现象在 OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!二、简介工厂模式主要是为创建对象提供了接口。工厂模式按照Java与模式中的提法分为三类:1.简单工厂模式(Simpie Factory)2.工厂方法模式(Factory Method)3.抽象工厂模式(Abstract Factory)这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况:1.在编码
3、时不能预见需要创建哪种类的实例2.系统不应依赖于产品类实例如何被创建、组合和表达的细节三、简单工厂模式顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下它由三种角色组成(关系见下面的类图):1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑java中它往往由一个具体类实现。2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。Concrete ProductJava设计模式之工丿模式(Factory)CSDNIE QQ百度 我挖 Google POCC
4、Yahoo新浪365Key天极和讯博拉Live 奇客鲜果 收客饭否 叽歪 挖客奔驰车!,坐上Bmw后他说 开 作者:和水柔石一、引子Product 开车 就可以了。来看看怎么实现的:1./ 工厂类角色2.public class Driver3.4./ 工厂方法5./ 注意 返回类型为抽象产品角色6.public static Car driverCar(Strings)throwsException 8.那么简单工厂模式怎么用呢?我来举个例子吧,我想这个比讲一大段理论上的文字描述要容易理解的多!下面就来给那个暴 发户治病 : P在使用了简单工厂模式后,现在暴发户只需要坐在车里对司机说句:。(
5、奥迪我就不写了 :P )7./ 判断逻辑,返回具体的产品角色给 Client2.publicinterface Car3.publicvoid drive();4.5./ 具体产品角色6.publicclass Benz implements Car7.publicvoid drive() 8.System.out.println(Driving Benz );2.publicclass Bmw implements Car13.publicvoid drive() 14.System.out.println(Driving Bmw );15.16.1./ 抽象产品角色ret
6、urn new Benz();10.elseif(s.equalsIgnoreCase(Bmw)11.returnnew Bmw();12.13.14.elsethrow new Exception();15.。16.17./ 欢迎暴发户出场 .18.publicclass Magnate19.publicstatic void main(String20.try9.if(s.equalsIgnoreCase(Benz)args)public 。程序中类之间的关系如下:对扩展开放、对修改关闭;但是工厂正如我前面提到的简单工厂模式适用于业务将简单的情况下。而对于复杂的业务环境可能不太适应阿这就应
7、该由工厂方法:(2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。25.如果将所有的类放在一个文件中,请不要忘记只能有一个类被声明为Magnate这便是简单工厂模式了。下面是其好处:首先,使用了简单工厂模式后,我们的程序不在“有病“,更加符合现实中的情况;而且客户端免除了直接创建产品对象的 责任,而仅仅负责-消费-产品(正如暴发户所为) 下面我们从
8、开闭原则上来分析下简单工厂模式。当暴发户增加了一辆车的时候,只要符合抽象产品制定的合同,那么只要通 知工厂类知道就可以被客户使用了。那么对于产品部分来说,它是符合开闭原则的 部分好像不太理想,因为每增加一辆车,都要在工厂类中增加相应的商业逻辑和判断逻辑,这显自然是违背开闭原则的。对于这样的工厂类(在我们的例子中是为司机师傅),我们称它为全能类或者上帝类。我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝类坏了,进而累坏了我们可爱的程序员模式来出场了! 四、工厂方法模式 先来看下它的组成吧: 1、
9、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现的类来实现。来用类图来清晰的表示下的它们之间的关系:21./告诉司机我今天坐奔驰22.Car carDnver.driverCar(be nz);23./ 下命令:开车24.car.driveO;DiirverBenzCarCreatorCreatorC C oncreoncre teCteC leatorleator 1 1 C C oneone reteCrereteCre a a todtod话说暴发户生意越做越大,自己的爱车么多年的份上,1./抽象
10、产品角色,具体产品角色与简单工厂模式类似,只是变得复杂了些,这里略。/抽象工厂角色-nProductProduct我们还是老规矩使用一个完整的例子来看看工厂模式各个角色之间是如何来协调的。也越来越多。这可苦了那位司机师傅了,什么车它都要记得,维护,都要经过他来使用!于是暴发户同情他说:看你跟我这以后你不用这么辛苦了, 我给你分配几个人手, 你只管管好他们就行了! 于是,工厂方法模式的管理出现了。代码如下:4.publicCardriverCarO;5.&publicclassBen zDriverimpi eme ntsDriver7.publicCardriverCarO&returnnew
11、BenzO;9.10.11.publicclassBmwDriver impI eme ntsDriver12.publicCardriverCarO13.returnnewBmwO;14.15.16./应该和具体产品形成对应关系,这里略.17./有请暴发户先生18.publicclassMag nate19.20.publicstaticvoidmai n( Stri ngargs)21.22.try23.Driverdriver= new Ben zDriverO;24.25.Car car=driver.driverCarO;26.car.driveO;27.catch(Exce pti
12、one)3P ublicinterface Driver具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java 中它由具体的让我们来看看工厂方法模式给我们使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时, 就会出现大量的与之对应的工厂类,如果不使用工厂模式来实现我们的例子,也许代码会减少很多只需要实现已有的车,不使用多态。但是在可维护性上,BenzSportsCar 和 BmwSportsCar 就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar 和 BenzSportsCar
13、也是一个产品族。在 java抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java 中一般有抽象类或者接口来实现具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java 中由具体的类来实现28.29.30.工厂方法使用一个抽象工厂角色作为核心来代替在简单工厂模式中使用具体类作为核心。带来了什么?使用开闭原则来分析下工厂方法模式。当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽 象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。看来,工厂方法模式是完全符合开闭原则的!这不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂
14、方法模式相结合的方式来减少工厂类:即对于 产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产品树上存在产品族,那么这种情况下就可能可以 使用抽象工厂模式了。五、小结让我们来看看简单工厂模式、工厂方法模式给我们的启迪:可扩展性上是非常差的(你可以想象一下,添加一辆车后要牵动的类)。因此为了提高扩展性和维护性,多写些代码是值得 的。六、抽象工厂模式 先来认识下什么是产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。如果光看这句话就能清楚的理解这个 概念,我不得不佩服你啊。还是让我们用一个例子来形象地说
15、明一下吧。图中的 BmwCar 和 BenzCar 就是两个产品树(产品层次结构);而如图所示的回到抽象产品模式的话题上,可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式 是三个里面最为抽象、 最具一般性的。 抽象工厂模式的用意为: 给客户端提供一个接口, 可以创建多个产品族中的产品对象 而且使用抽象工厂模式还要满足一下条件: 1. 系统中有多个产品族,而系统一次只可能消费其中一族产品 2. 同属于同一个产品族的产品以其使用。来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的核心, 它与应用程序无关。 是具体工厂角色必须实
16、现的接口或者必须继承的父类。中它由抽象类或者接口来实现。类来实现。17.18.19.C C leatorleatorProductAProductAProdudAProdudAI IConcreteCrConcreteCre e日toritoriConcreteCrConcreteCreator2eator2ProductA2ProductA2P P rodudBrodudBProductBIProductBIProductB2ProductB2看过了前两个模式,对这个模式各个角色之间的协调情况应该心里有个数了,我就不举具体的例子了。只是一定要注意满足 使用抽象工厂模式的条件哦,不然即使存在了
17、多个产品树,也存在产品族,但是不能使用的附带一个例子:htt P: /www.blogjava. neflustar/archive/2007/11/29/factoryMethod.html1.FactoryMethod模式2.p ublicabstractclassBall 3.p rotectedabstractvoidPlayO;4.5.6.p ublicclassBasketballexte ndsBall 7.8.p rotectedvoidplayO9.System.out. println (” playthebasketball );3.p ubliccl
18、assFootballexte ndsBall 14.15.p rotectedvoidplayO16.System.out. println (” playthe football );20.p ublicabstractclassBallFactory 21.p rotectedabstractBallmakeBallO;2.23.24.publicclass BasketballFact extends BallFactory 25.26.protected BallmakeBall() 27.returnnew Basketball();1.publicclass FootballFact extends BallFactory 32.33.protected BallmakeBall() 34.returnnew Football();35.36
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安徽省合肥市蜀山区中考物理一模试卷(含解析)
- 中国人民大学《英语演讲与辩论理解当代中国》2023-2024学年第二学期期末试卷
- 西安美术学院《钢琴即兴配奏与弹唱》2023-2024学年第一学期期末试卷
- 四川省雅安市天全县2025届六年级下学期5月模拟预测数学试题含解析
- 山东省齐河、夏津、临邑、禹城、武城五县达标名校2024-2025学年初三第二学期综合练习(一)生物试题试卷含解析
- 河北经贸大学经济管理学院《综合英语》2023-2024学年第一学期期末试卷
- 武汉工商学院《临床流行病学与循证医学》2023-2024学年第一学期期末试卷
- 上海济光职业技术学院《幼儿教师语言与写作技能》2023-2024学年第二学期期末试卷
- 山东省临沭一中2025年第二学期期中七校联考高三物理试题含解析
- 朔州职业技术学院《热工测试技术》2023-2024学年第二学期期末试卷
- 【医疗管理案例】:以专科化改革促进医院战略发展-中南大学湘雅医院学科建设实践案例
- 设计研究与人因工程结合发展
- 输变电工程施工质量验收统一表式附件1:线路工程填写示例
- 湖北省卫生健康委科研项目申报书(上、下册)
- 《海域资源资产核算技术规程》
- 【宝钢股份环境会计信息披露问题探究6700字(论文)】
- 2022-2023学年福建省厦门市集美区部编版四年级下册期中考试语文试卷
- 陕西省2024年高中学业水平合格考数学试卷试题(含答案)
- TD/T 1061-2021 自然资源价格评估通则(正式版)
- 2024年新乡职业技术学院单招职业适应性测试题库附答案
- 中国大学mooc《风险投资与私募股权(四川大学) 》章节测试答案
评论
0/150
提交评论