《Java设计模式》结课_第1页
《Java设计模式》结课_第2页
《Java设计模式》结课_第3页
《Java设计模式》结课_第4页
《Java设计模式》结课_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——《Java设计模式》结课葡萄类的源代码如下所示。可以看出,Grape类同样实现了水果接口,从而是水果类型的一种子类型。

代码清单3:类Grape的源代码publicclassGrapeimplementsFruit{privatebooleanseedless;//生长

publicvoidgrow(){

log(\}//收获

publicvoidharvest(){

log(\}//种植

publicvoidplant(){

log(\}

//辅助方法

publicstaticvoidlog(Stringmsg){System.out.println(msg);}

//有无籽的取值方法publicbooleangetSeedless(){returnseedless;}

//有无籽的赋值方法

publicvoidsetSeedless(booleanseedless){this.seedless=seedless;}}

Strawberry类实现了Fruit接口,因此,也是水果类型的子类型,其源代码如下所示。

代码清单4:类Strawberry的源代码publicclassStrawberryimplementsFruit{//生长

publicvoidgrow(){

log(\}//收获

publicvoidharvest(){

log(\}//种植

publicvoidplant(){

log(\}

//辅助方法

publicstaticvoidlog(Stringmsg){System.out.println(msg);}

}

农场的园丁也是系统的一部分,自然要由一个适合的类来代表。这个类就FruitGardener类,其结构由下面描述。

FruitGardener类会根据客户端的要求,创立出不同的水果对象,譬如苹果(Apple),葡萄(Grape)或草莓(Strawberry)的实例。而假使接到不合法的要求,FruitGardener类会抛出BadFruitException异常。园丁类的源代码如下所示。

代码清单5:FruitGardener类的源代码publicclassFruitGardener{//静态工厂方法

publicstaticFruitfactory(Stringwhich)throwsBadFruitException{if(which.equalsIgnoreCase(\returnnewApple();}

elseif(which.equalsIgnoreCase(\returnnewStrawberry();}

elseif(which.equalsIgnoreCase(\returnnewGrape();}else{

thrownewBadFruitException(\}}}

可以看出,园丁类提供了一个静态工厂方法。在客户端的调用下,这个方法创立客户端所需要的水果对象。假使客户端的请求是系统所不支持的,工厂方法就会抛出一个BadFruitException异常。这个异常类的源代码如下所示。代码清单6:BadFruitException类的源代码

publicclassBadFruitException

extendsException{

publicBadFruitException(Stringmsg){super(msg);}}

在使用时,客户端只需调用FruitGardener的静态方法factory()即可。请见下面的示意性客户端源代码。

代码清单7:实现种植即Main()的实现publicclassPlantFruit{publicPlantFruit(){}

publicstaticvoidmain(String[]args){PlantFruitplantfruit=newPlantFruit();try{

//种植葡萄

FruitGardener.factory(\FruitGardener.factory(\FruitGardener.factory(\

System.out.println(\//种植苹果

FruitGardener.factory(\

FruitGardener.factory(\FruitGardener.factory(\

System.out.println(\//种植草莓

FruitGardener.factory(\FruitGardener.factory(\FruitGardener.factory(\

System.out.println(\}

catch(BadFruitExceptione){}}}

到此为止,我们的简单程序已经设计完成,我们可以通过创立FruitGardener对象来完成水果的种植,无论你要种什么,只需调用对象中的factory()方法。工厂类的示意性源代码如下所示。可以看出,这个工厂方法创立了一个新的具体产品的实例并返还给调用者。代码清单8:Creator类的源代码publicclassCreator{

//静态工厂方法

publicstaticProductfactory(){

returnnewConcreteProduct();}}

抽象产品角色的主要目的是给所有的具体产品类提供一个共同的类型,在最简单的状况下,可以简化为一个标识接口。所谓标识接口,就是没有声明任何方法的空接口。

代码清单9:抽象角色Product接口的源代码publicinterfaceProduct{}

具体产品类的示意性源代码如下。

代码清单10:具体产品角色ConcreteProduct类的源代码publicclassConcreteProductimplementsProduct{

publicConcreteProduct(){}

}

虽然在这个简单的示意性实现里面只给出了一个具体产品类,但是在实际应用中一般都会遇到多个具体产品类的状况。

三个人体会

在操作中总结发现了程序设计模式优缺点:工厂方法模式的优点如下:

(1)在工厂方法模式中,工厂方法用来创立客户所需要的产品,同时还向客户隐蔽了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无需关心创立细节,甚至无需知道具体产品类的类名。

(2)基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创立何种产品对象,而如何创立这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,正是由于所有的具体工厂类都具有同一抽象父类。

(3)使用工厂方法模式的另一个优点是在系统中参与新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了,这样,系统的可扩展性也就变得十分好,完全符合“开闭原则〞。工厂方法模式的缺点如下:

(1)在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的繁杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。

(2)由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

总的来说设计模式实际上是良好的工厂模式思想的一种提炼。每一种设计模式后面都表达了一种良好的工厂模式思路,这些思路对于解决软件中常见的“c

温馨提示

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

评论

0/150

提交评论