在上一篇中学习了简单工厂模式,在简单工厂模式(Simple Factory Pattern)中,只是有限的支持了开-闭原则(一个系统的设计要求允许系统在无修改的情况下,扩展其功能)。当我们需要增加一种产品时,我们就不得不做一件很头疼的事:修改FruitsGrower类(creator),以使他能生产出新增的产品。而接下来的工厂方法模式则是体现了java的多态性,完全符合了开闭原则。工厂方法模式的实现依赖于工厂角色和产品角色的多态性。当在某些特殊情况下,这个模式可以退化,例如退化成简单工厂模式,特征就是多态性的丧失。
继续水果为例:首先UML图如下:

源代码:
接口:FruitFactory
public interface FruitFactory {
public Fruits factory();
}
接口:Fruits
public interface Fruits {
public void grow();
public void plant();
public void harvest();
}
类:AppleFactory
public class AppleFactory implements FruitFactory {
public Fruits factory() {
return new Apple();
}
}
类:GrapeFactory
public class GrapeFactory implements FruitFactory {
public Fruits factory() {
// TODO 自动生成方法存根
return new Grape();
}
}
类:Apple
public class Apple implements Fruits {
/*
* 苹果的特有属性。苹果数的树龄
*/
private int treeage;
public int getTreeage() {
return treeage;
}
public void setTreeage(int treeage) {
this.treeage = treeage;
}
public void grow() {
System.out.println("苹果的生长方法");
}
public void harvest() {
System.out.println("苹果的收获方法");
}
public void plant() {
System.out.println("苹果的种植方法");
}
}
类:Grape
public class Grape implements Fruits {
public boolean seedless;
public void grow() {
System.out.println("葡萄的生长");
}
public void harvest() {
System.out.println("葡萄的收获");
}
public void plant() {
System.out.println("葡萄的种植");
}
public boolean isSeedless() {
return seedless;
}
public void setSeedless(boolean seedless) {
this.seedless = seedless;
}
}
测试方法:Test.java
public static void main(String args[])
{
FruitFactory create; //声明工厂
Fruits product; //声明产品
create=new AppleFactory();
product=create.factory();
product.grow(); //调用产品的方法
}
工厂方法返回的应该是抽象类型,而不是具体类型,只有这样,才能保证多态性。当需要一个新产品时,只要创建一个产品类,一个工厂类,并实现相应的接口就OK。
工厂方法模式在jDK API中的 应用:
工厂方法模式在JDK中的应用到处可见,例如:Collection

所有的实现Collection的类必须实现iteratror()方法,返回一个具体的Iterator类
posted on 2007-07-01 10:17
李桢 阅读(183)
评论(0) 编辑 收藏 所属分类:
java设计模式