Java中的简单工厂模式.doc_第1页
Java中的简单工厂模式.doc_第2页
Java中的简单工厂模式.doc_第3页
Java中的简单工厂模式.doc_第4页
Java中的简单工厂模式.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式:女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。女娲造人,这就是简单工厂模式的应用。 首先,在这个造人的思想里面,有几个重要的角色:女娲本身、抽象的人的概念和女娲所造出的一个个具体的人。1.)女娲是一个工厂类,也就是简单工厂模式的核心角色。 2.)具休的一个个的人,包括张三,李四等。这些人便是简单工厂模式里面的具体产品角色3.)抽象的人是最早只存在于女娲的头脑里的一个想法,女娲按照这个想法造出的一个个具体的人,便都符合这个抽象的人的定义。换言之,这个抽象的想法规定了所有具体的人必须都有的接口(特征或者功能)其UML类图出下所示:理解了上面的这些东西,再来理解下面的例子,对照理解,相信看完这篇文章,便对java简单工厂模式有一个很好的理解:有一个农场公司,专门向市场销售各类水果,在这个系统里需要描述下列水果:葡萄Grape草莓Stuawberry苹果Apple水果与其他植物不同,最终可以采摘食用,那么一个自然的做法是建立一个各种水果都适用的接口,以便与其他农场里的植物区分开来,此时,则是为水果类声明了一个接口,表现在代码上:1 public interface Fruit 2 / 生长 3 void grow();4 / 收获 5 void harvest();6 / 种植 7 void plant();8 9 10 水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法plant(),grow(),和harvest();Apple类是水果类的一种,因此它实现了水果接口所声明的所有方法。另处,由于苹果是多年生植物,因此多出一个treeAge性质,描述苹果的树龄。代码如下所示:package fac;public class Apple implements Fruit / 通过implements实现接口Fruit private int treeAge; public void grow() log( Appleisgrowing ); public void harvest() log( Applehasbeenharvested ); public void plant() log( Applehabeenplanted ); public static void log(Stringmsg) System.out.println(msg); public int getTreeAge() return treeAge; public void setTreeAge( int treeAge) this .treeAge = treeAge; 同理,葡萄Grape:packagefac;publicclassGrapeimplementsFruitprivatebooleanseedless;publicvoidgrow()log(Grapeisgrowing.);publicvoidharvest()log(Grapehasbeenharvested);publicvoidplant()log(Grapehabeenplanted);publicstaticvoidlog(Stringmsg)System.out.println(msg);publicbooleanisSeedless()returnseedless;publicvoidsetSeedless(booleanseedless)this.seedless=seedless;草莓Stuawberry:packagefac;publicclassStrawberryimplementsFruitpublicvoidgrow()log(Strawberryisgrowing);publicvoidharvest()log(Strawberryhasbeenharvested);publicvoidplant()log(Strawberryhasbeenplanted);publicstaticvoidlog(Stringmsg)System.out.println(msg);农场园丁也是系统的一部分,由一个类来代表,FruitGardener类,代码如下:packagefac;publicclassFruitGardenerpublicstaticFruitfactory(Stringwhich)throwsExceptionif(which.equalsIgnoreCase(apple)returnnewApple();elseif(which.equalsIgnoreCase(strawberry)returnnewStrawberry();elseif(which.equalsIgnoreCase(grape)returnnewGrape();elsethrownewException(Badfruitrequest);这时有人来果园玩,和园丁说,给我们介绍下你的水果吧。于是园丁:packagefac;publicclassPeoplepublicstaticvoidmain(Stringargs)throwsExceptionFruitGardenerfg=newFruitGardener();Fruitap=fg.factory(Apple);ap.grow();Fruitgp=fg.factory(Grape);gp.plant();Fruitdd=fg.factory(ddd);/抛出Badfruitrequest异常(注:以上代码在JDK5.0,Myeclise3.2下编译通过)类比两个例子,园丁就相当于女娲,而水果就相当于具体的人,接口水果类就相当于存在于类女娲思想里的人的抽象概念。由以上两个例子可得出,简单工厂模式需要由以下角色组成:接口接口的实现类(简单工厂模式里面的具体产品角色)工厂理解了以下两个例子,再来看第三个例子:注意对比以下三个实例的不同实例:packageorg.jzkangta.factorydemo01;/定义接口interfaceCarpublicvoidrun();publicvoidstop();/具体实现类classBenzimplementsCarpublicvoidrun()System.out.println(Benz开始启动了。);publicvoidstop()System.out.println(Benz停车了。);/具体实现类classFordimplementsCarpublicvoidrun()System.out.println(Ford开始启动了。);publicvoidstop()System.out.println(Ford停车了。);/工厂classFactorypublicstaticCargetCarInstance()returnnewFord();publicclassFactoryDemo01publicstaticvoidmain(Stringargs)Carc=Factory.getCarInstance();c.run();c.stop();实例二:packagefac;/定义接口interfaceCarpublicvoidrun();publicvoidstop();/具体实现类classBenzimplementsCarpublicvoidrun()System.out.println(Benz开始启动了。);publicvoidstop()System.out.println(Benz停车了。);classFordimplementsCarpublicvoidrun()System.out.println(Ford开始启动了。);publicvoidstop()System.out.println(Ford停车了。);/工厂classFactorypublicstaticCargetCarInstance(Stringtype)Carc=null;if(Benz.equals(type)c=newBenz();if(Ford.equals(type)c=newFord();returnc;publicclassFactoryDemo02publicstaticvoidmain(Stringargs)Carc=Factory.getCarInstance(Benz);if(c!=null)c.run();c.stop();elseSystem.out.println(造不了这种汽车。);实例三:interfaceCarpublicvoidrun();publicvoidstop();classBenzimplementsCarpublicvoidrun()System.out.println(Benz开始启动了。);publicvoidstop()System.out.println(Benz停车了。);classFordimplementsCarpublicvoidrun()System.out.println(Ford开始启动了。);publicvoidstop()System.out.println(Ford停车了。);classToyotaimplementsCarpublicvoidrun()System.out.println(Toyota开始启动了。);publicvoidstop()System.out.println(Toyota停车了。);classFactorypublicstaticCargetCarInstance(Stringtype)Carc=null;tryc=(Car)Class.forName(org.jzkangta.factorydemo03.+type).newInstance();/利用反射得到汽车类型catch(InstantiationExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();catch(IllegalAccessExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();catch(ClassNotFoundExceptione)/TODOAuto-generatedcatchblocke.printStackTrace();returnc;publicclassFactoryDemo03publicstaticvoidmain(Stringargs)Carc=Factory.getCarInstance(Toyota);if(c!=null)c.run();c.stop();elseSystem.out.println(造不了这种汽车。);对比三个实例:实例一,虽然实现了简单工厂,但每次只能得到一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论