园丁类的源代码如下所示。代码清单5:FruitGardener类的源代码publicclassFruitGardener{//静态工厂方法publicstaticFruitfactory(Stringwhich)throwsBadFruitException{if(which.equalsIgnoreCase("apple")){returnnewApple();}elseif(which.equalsIgnoreCase("strawberry")){
returnnewStrawberry();}elseif(which.equalsIgnoreCase("grape")){returnnewGrape();}else{thrownewBadFruitException("Badfruitrequest");}}}可以看出,园丁类提供了一个静态工厂方法。在客户端的调用下,这个方法创建客户端所需要的水果对象。如果客户端的请求是系统所不支持的,工厂方法就会抛出一个BadFruitException异常。这个异常类的源代码如下所示。代码清单6:BadFruitException类的源代码publicclassBadFruitExceptionextendsException{publicBadFruitException(Stringmsg){super(msg);}}在使用时,客户端只需调用FruitGardener的静态方法factory()即可。请见下面的示意性客户端源代码。代码清单7:实现种植即Main()的实现publicclassPlantFruit{publicPlantFruit(){
}publicstaticvoidmain(String[]args){PlantFruitplantfruit=newPlantFruit();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(BadFruitExceptione){}
}}到此为止,我们的简单程序已经设计完成,我们可以通过创建FruitGardener对象来完成水果的种植,无论你要种什么,只需调用对象中的factory()方法。输出结果如下:三.简单工厂模式的定义简单工厂模式是类的创建模式,又叫做静态工厂方法(StaticFactoryMethod)模式。简单工厂模式是由一个工厂对象决定创建出那一种产品类的实例。四.简单工厂模式的结构简单工厂模式是类的创建模式,这个模式的一般性结构如下图所示。
角色与结构简单工厂模式就是由一个工厂类可以根据传入的参量决定创建出哪一种产品类的实例。下图所示为以一个示意性的实现为例说明简单工厂模式的结构。
从上图可以看出,简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色等三个角色:(1)工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体
Java类实现。(2)抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽象类实现。(3)具体产品(ConcreteProduct)角色:工厂方法模式所创建的任何对象都是这个角
色的实例,具体产品角色由一个具体Java类实现。工厂类的示意性源代码如下所示。可以看出,这个工厂方法创建了一个新的具体产品的实例并返还给调用者。代码清单8:Creator类的源代码publicclassCreator{//静态工厂方法publi