快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
何一个,见下面的位图

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

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

时间:2010-12-17

由实工厂1(横数轴上第一点)创立的对象来自实产品类(1,1), (1,2), (1,3),...。由实工厂2(横数轴上第二点)创立的对象来自实产品类(2,1), (2,2), (3,3),...。依此类推

工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。

反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。

与简单工厂模式中的情形一样的是,ConcreteCreator 的factory() 方法返还的数据类型是一个接口 PlantIF,而不是哪一个具体的产品类。这种设计使得工厂类创立哪一个产品类的实例细节完全封装在工厂类内部。

工厂方法模式又叫多形性工厂模式,显然是因为实工厂类都有共同的接口,或者都有共同的抽象父类。

工厂方法模式在小花果园系统中的实现

好了,现在让我们回到小花果园的系统里,看一看怎样发挥工厂方法模式的威力,解决需要接连不断向小花果园引进不同类别的植物所带来的问题。

首先,我们需要一个抽象工厂类,比如叫做 Gardener,作为两个实工厂类 FruitGardener 及 VeggieGardener 的父类。 Gardener 的 factory() 方法可以是抽象的,留给子类去实现,也可以是实的,在父类实现一部分功能,再在子类实现剩余的功能。我们选择将 factory() 做成抽象的,主要是因为我们的系统是一个示范系统,内容十分简单,没有要在父类实现的任何功能。

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

图5. 工厂方法模式在小花果园系统中的实现

抽象工厂类 Gardener 是工厂方法模式的核心,但是它并不掌握水果类或蔬菜类的生杀大权。相反地,这项权力被交给子类,即 VeggieGardener 及 FruitGardener。

package com.javapatterns.factorymethod; abstract public class Gardener {   public abstract PlantIF factory(String which) throws BadFruitException; }

代码清单1. 父类 Gardener。

package com.javapatterns.factorymethod; public class VeggieGardener extends Gardener {   public PlantIF factory(String which) throws BadPlantException   {    if (which.equalsIgnoreCase("tomato"))    {     return new Tomato();    }    else if (which.equalsIgnoreCase("potato"))    {     return new Potato();    }    else if (which.equalsIgnoreCase("broccoli"))    {     return new Broccoli();    }    else    {     throw new BadPlantException("Bad veggie request");    }   } }

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

时间:2010-12-17

代码清单2. 子类 VeggieGardener。

package com.javapatterns.factorymethod; public class FruitGardener extends Gardener {   public PlantIF factory(String which)   {    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 BadPlantException("Bad fruit request");    }  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号