




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一. 程序设计目标 我们组写了个简单的水果生产程序,描述农场种植水果的过程,旨在通过此次设计更进一步了解工程设计模式,加强编程的结构化能力。 开发环境:JDK1.5开发工具:JBuilder 2006二程序设计介绍1.程序结构 我们组为一个水果公司写了个简单的生产程序,该公司专门向市场销售各类水果。我们为程序建立了一个名为farm的工程,程序结构比较简单,总共有7个类,并且都放在一个默认的包中。其层次结构可从下图体现出来:对各个类的说明:Fruit类:水果接口,实现水果方法Apple类:苹果类,实现Fruit接口Grape类:葡萄类,实现Fruit接口Strawberry类:草莓类,实现Fruit接口FruitGardener类:园丁类,可种植各种水果BadFruitException类:要种植的水果不在公司经营的水果范围之内,抛出种植异常PlantFruit类:实现main()方法2.程序设计步骤在这个系统里需要描述下列的水果:葡萄 Grape草莓 Strawberry苹果 Apple水果与其他的植物有很大的不同,就是水果最终是可以采摘食用的。那么一个自然的作法就是建立一个各种水果都适用的接口,以便与农场里的其他植物区分开。如下图所示。水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法:种植plant(),生长grow()以及收获harvest()。接口Fruit 的类图如下所示。这个水果接口的源代码如下所示。代码清单1:接口Fruit 的源代码public interface Fruit / 生长void grow();/收获void harvest();/种植void plant();描述苹果的Apple 类的源代码的类图如下所示。Apple 类是水果类的一种,因此它实现了水果接口所声明的所有方法。另外,由于苹果是多年生植物,因此多出一个treeAge 性质,描述苹果树的树龄。下面是这个苹果类的源代码。代码清单2:类Apple 的源代码public class Apple implements Fruit private int treeAge;/生长public void grow() log(Apple is growing.);/ 收获public void harvest() log(Apple has been harvested.);/种植public void plant() log(Apple has been planted.);/ 辅助方法public static void log(String msg) System.out.println(msg);/树龄的取值方法public int getTreeAge() return treeAge;/ 树龄的赋值方法public void setTreeAge(int treeAge) this.treeAge = treeAge;同样,Grape 类是水果类的一种,也实现了Fruit 接口所声明的所有的方法。但由于葡萄分有籽和无籽两种,因此,比通常的水果多出一个seedless 性质,如下图所示。葡萄类的源代码如下所示。可以看出,Grape 类同样实现了水果接口,从而是水果类型的一种子类型。代码清单3:类Grape 的源代码public class Grape implements Fruit private boolean seedless;/生长public void grow() log(Grape is growing.);/收获public void harvest() log(Grape has been harvested.);/种植public void plant() log(Grape has been planted.);/辅助方法public static void log(String msg) System.out.println(msg);/ 有无籽的取值方法public boolean getSeedless() return seedless;/有无籽的赋值方法public void setSeedless(boolean seedless) this.seedless = seedless;下图所示是Strawberry 类的类图。Strawberry 类实现了Fruit 接口,因此,也是水果类型的子类型,其源代码如下所示。代码清单4:类Strawberry 的源代码public class Strawberry implements Fruit /生长public void grow() log(Strawberry is growing.);/收获public void harvest() log(Strawberry has been harvested.);/种植public void plant() log(Strawberry has been planted.);/辅助方法public static void log(String msg) System.out.println(msg);农场的园丁也是系统的一部分,自然要由一个合适的类来代表。这个类就FruitGardener 类,其结构由下面的类图描述。FruitGardener 类会根据客户端的要求,创建出不同的水果对象,比如苹果(Apple),葡萄(Grape)或草莓(Strawberry)的实例。而如果接到不合法的要求,FruitGardener 类会抛出BadFruitException 异常,如下图所示。园丁类的源代码如下所示。代码清单5:FruitGardener 类的源代码public class FruitGardener /静态工厂方法public static Fruit factory(String which) throws BadFruitException if (which.equalsIgnoreCase(apple) return new Apple(); else if (which.equalsIgnoreCase(strawberry) return new Strawberry(); else if (which.equalsIgnoreCase(grape) return new Grape(); else throw new BadFruitException(Bad fruit request); 可以看出,园丁类提供了一个静态工厂方法。在客户端的调用下,这个方法创建客户端所需要的水果对象。如果客户端的请求是系统所不支持的,工厂方法就会抛出一个BadFruitException 异常。这个异常类的源代码如下所示。代码清单6:BadFruitException 类的源代码public class BadFruitException extends Exception public BadFruitException(String msg) super(msg);在使用时,客户端只需调用FruitGardener 的静态方法factory()即可。请见下面的示意性客户端源代码。代码清单7:实现种植即Main()的实现public class PlantFruit public PlantFruit() public static void main(String args) PlantFruit plantfruit = new PlantFruit(); try /种植葡萄 FruitGardener.factory(grape).plant(); FruitGardener.factory(grape).grow(); FruitGardener.factory(grape).harvest(); System.out.println(=); /种植苹果 FruitGardener.factory(apple).plant(); FruitGardener.factory(apple).grow(); FruitGardener.factory(apple).harvest(); System.out.println(=); /种植草莓 FruitGardener.factory(strawberry).plant(); FruitGardener.factory(strawberry).grow(); FruitGardener.factory(strawberry).harvest(); System.out.println(=); catch (BadFruitException e) 到此为止,我们的简单程序已经设计完成,我们可以通过创建FruitGardener对象来完成水果的种植,无论你要种什么,只需调用对象中的factory()方法。输出结果如下:三简单工厂模式的定义简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。四简单工厂模式的结构简单工厂模式是类的创建模式,这个模式的一般性结构如下图所示。角色与结构简单工厂模式就是由一个工厂类可以根据传入的参量决定创建出哪一种产品类的实例。下图所示为以一个示意性的实现为例说明简单工厂模式的结构。从上图可以看出,简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色等三个角色:(1)工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java 类实现。(2)抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java 接口或者Java 抽象类实现。(3)具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java 类实现。工厂类的示意性源代码如下所示。可以看出,这个工厂方法创建了一个新的具体产品的实例并返还给调用者。代码清单8:Creator 类的源代码public class Creator/静态工厂方法public static Product factory()return new ConcreteProduct();抽象产品角色的主要目的是给所有的具体产品类提供一个共同的类型,在最简单的情况下,可以简化为一个标识接口。所谓标识接口,就是没有声明任何方法的空接口。代码清单9:抽象角色Product 接口的源代码public interface Product具体产品类的示意性源代码如下。代码清单10:具体产品角色ConcreteProduct 类的源代码public class ConcreteProduct implements Productpublic ConcreteProduct()虽然在这个简单的示意性实现里面只给出了一个具体产品类,但是在实际应用中一般都会遇到多个具体产品类的情况。五简单工厂模式的实现1多层次的产品结构在真实的系统中,产品可以形成复杂的等级结构,比如下图所示的树状结构上就有多个抽象产品类和具体产品类。这个时候,简单工厂模式采取的是以不变应万变的策略,一律使用同一个工厂类。如下图所示。图中从Factory 类到各个Product 类的虚线代表创建(依赖)关系;从Client 到其他类的联线是一般依赖关系。这样做的好处是设计简单,产品类的等级结构不会反映到工厂类中来,从而产品类的等级结构的变化也就不会影响到工厂类。但是这样做的缺点是,增加新的产品必将导致工厂类的修改。2 使用Java 接口或者Java 抽象类如果模式所产生的具体产品类彼此之间没有共同的商业逻辑,那么抽象产品角色可以由一个Java 接口扮演;相反,如果这些具体产品类彼此之间确有共同的商业逻辑,那么这些公有的逻辑就应当移到抽象角色里面,这就意味着抽象角色应当由一个抽象类扮演。在一个类型的等级结构里面,共同的代码应当尽量向上移动,以达到共享的目的,如下图所示。六模式的优点和缺点1 模式的优点模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式通过这种做法实现了对责任的分割。2 模式的缺点正如同在本章前面所讨论的,当产品类有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,就是模式的缺点。这个工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类,有人把这种类叫做上帝类(God Class)。如果这个全能类代表的是农场的一个具体园丁的话,那么这个园丁就需要对所有的产品负责,成了农场的关键人物,他什么时候不能正常工作了,整个农场都要受到影响。将这么多的逻辑集中放在一个类里面的另外一个缺点是,当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。这一缺点在工厂方法模式中得到克服。由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。这一缺点会在工厂方法模式中得到克服。七个人体会 设计模式实际上是良好的OO思想的一种提炼。每一种设计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三年级信息技术上册 第十二课 我做小玩具教学设计 华中师大版
- 七年级生物上册 第一单元 第1章 第1节 生物的特征教学设计 (新版)新人教版
- 人教版六年级音乐下册 第四单元唱歌《爱我中华》教学设计
- 妇幼保健院医疗保健技术培训
- 七年级地理下册 第四章 第二节 土地资源与农业教学设计 中图版
- 冀教版(2024)七年级上册(2024)5.3 解一元一次方程教学设计
- 七年级数学下册 第六章 实数6.2 立方根教学设计 (新版)新人教版
- 人教2011课标版地理七年级下:6.2 亚洲的自然环境 教学设计
- 人教版 (新课标)七年级下册第四单元 生物圈中的人第一章 人的由来第一节 人的起源和发展教案配套
- 初中政治思品人教部编版七年级上册(道德与法治)享受学习教案设计
- 2024年新疆财经大学招聘事业编制人员真题
- 2025年山东交运怡亚通供应链管理有限公司招聘笔试参考题库含答案解析
- 自主招生常考试题及答案
- 私人水源转让协议合同
- 2025年中国坡莫合金磁芯行业市场发展现状及投资战略咨询报告
- 教育培训公司的成本控制
- 四川成都历年中考作文题与审题指导(2005-2024)
- 北京市网球运动管理中心2024年下半年公开招聘工作人员笔试历年典型考题及考点剖析附带答案详解
- 电视台采编岗试题及答案
- 2025-2030中国全自动洗鞋机行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 期货交易基础知识单选题100道及答案
评论
0/150
提交评论