快速业务通道

Java语言工厂方法创立性模式介绍 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
} }

代码清单3. 子类 FruitGardener。

package com.javapatterns.factorymethod; public class Broccoli implements VeggieIF, PlantIF {   public void grow()   {    log("Broccoli is growing...");   }   public void harvest()   {    log("Broccoli has been harvested.");   }   public void plant()   {    log("Broccoli has been planted.");   }   private static void log(String msg)   {    System.out.println(msg);   }   public void pesticideDust(){ } }

代码清单4. 蔬菜类 Broccoli。其它的蔬菜类与 Broccoli 相似,因此不再赘述。

package com.javapatterns.factorymethod; public class Apple implements FruitIF, PlantIF {   public void grow()   {    log("Apple is growing...");   }   public void harvest()   {    log("Apple has been harvested.");   }   public void plant()   {    log("Apple has been planted.");   }   private static void log(String msg)   {    System.out.println(msg);   }   public int getTreeAge(){ return treeAge; }   public void setTreeAge(int treeAge){ this.treeAge = treeAge; }   private int treeAge; }

代码清单5. 水果类 Apple。与<简单工厂模式>一节里的Apple类相比,唯一的区别就是多实现了一个接口 PlantIF。其它的水果类与 Apple 相似,因此不再赘述。

package com.javapatterns.factorymethod; public class BadPlantException extends Exception {   public BadPlantException(String msg)   {    super(msg);   } }

代码清单6. 例外类 BadPlantException。

Java语言工厂方法创立性模式介绍(5)

时间:2010-12-17

工厂方法模式应该在什么情况下使用

既然工厂方法模式与简单工厂模式的区别很是微妙,那么应该在什么情况下使用工厂方法模式,又应该在什么情况下使用简单工厂模式呢?

一般来说,如果你的系统不能事先确定那一个产品类在哪一个时刻被实例化,从而需要将实例化的细节局域化,并封装起来以分割实例化及使用实例的责任时,你就需要考虑使用某一种形式的工厂模式。

在我们的小花果园系统里,我们必须假设水果的种类随时都有可能变化。我们必须能够在引入新的水果品种时,能够很少改动程序,就可以适应变化以后的情况。因此,我们显然需要某一种形式的工厂模式。

如果在发现系统只用一个产品类等级(hierarchy)就可以描述所有已有的产品类,以及可预见的未来可能引进的产品类时,简单工厂模式是很好的解决方案。因为一个单一产品类等级只需要一个单一的实的工厂类。

然而,当发现系统只用一个产品类等级不足以描述所有的产品类,包括以后可能要添加的新的产品类时,就应当考虑采用工厂方法模式。由于工厂方法模式可以容许多个实的工厂类,以每一个工厂类负责每一个产品类等级,因此这种模式可以容纳所有的产品等级。

在我们的小花果园系统里,不只有水果种类的植物,而且有蔬菜种类的植物。换言之,存在不止一个产品类等级。而且产品类等级的数目也随时都有可能变化。因此,简单工厂模式不能满足需要,为解决向题,我们显然需要工厂方法模式。

关于模式的实现

在实现工厂方法模式时,有下面一些值得讨论的地方。

第一丶在图四的类图定义中,可以对抽象工厂(Creator) 做一些变通。变通的种类有

抽象工厂(Creator) 不是接口而是抽象类。一般而言,抽象类不提供一个缺省的工厂方法。 这样可以有效地解决怎样实例化事先不能预知的类的问题。

抽象工厂(Creator) 本身是一个实类,并提供一个缺省的工厂方

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号