码农的空间

codding
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

工厂方法模式(Factory Method)

Posted on 2009-10-21 11:29  我是孙海龙  阅读(194)  评论(0编辑  收藏  举报

        工厂方法模式是在简单工厂模式的基础上提出来的。在简单工厂模式中由于工厂类只有一个静态方法,当系统中需要创建一个新的类时,为了让这个工厂类继续工作,必须在工厂类的静态方法里边添加新的if语句来适应这个新类。而在工厂方法模式中,不再使用一个单独的工厂类进行对象的创建。

        在工厂方法模式中,工厂类不在是一个单一的类,同时类中也不再只含有一个静态函数。工厂方法模式首先定义一个抽象的工厂类,作为其他工厂类的祖先,下边给出该抽象工厂类的代码示例(在此仍然使用接口来实现,接口也可以实现多态性):

public interface IFactory{
    public IAnimal createAnimal();
}

        定义好了具体工厂类的祖先,就可以具体的工厂类了,为了便于表述,先将具体类的祖先(仍然使用接口)和具体类的代码类出来,如下所示:

祖先类(接口):

public interface IAnimal{
    public void eat();
}

具体类1,Fish.java:

public class Fish implements IAnimal {
    public Fish(){};
    public void eat(){
        System.out.println("Fishes must eat!");
    }
    public void swim(){
        System.out.println("Fish can swim!");
    }
}

具体类2.Bird.java:

public class Bird implements IAnimal {
    public Bird(){}
    public void eat(){
        System.out.println("Birds must eat!");
    }
    public void fly(){
        System.out.println("Birds can fly!");
    }
}

        具体的工厂类实现了抽象工厂的接口,当系统中需要添加新的类的时候,只需要添加一个实现抽象接口的新的工厂类即可,这样便于代码的管理,这边给出两个具体的工厂类,这和简单工厂模式中的工厂类没有实质的区别,只不过不需要if进行判断了。代码如下:

FishFactory.java

public class FishFactory implements IFactory{
    public IAnimal createAnimal(){
        return new Fish();
    }
}

BirdFactory.java

public class BirdFactory implements IFactory{
    public IAnimal createAnimal(){
        return new Bird();
    }
}

请注意上边两个具体工厂类的createAnimal方法的返回值,不是具体的类而是IAnimal,这一点非常重要,通过这个可是实现多态性。最后是测试代码:

test.java

public class test {
    public static void main(String[] args){
        Fish f=(Fish)(new FishFactory()).createAnimal();
        Bird b=(Bird)(new BirdFactory()).createAnimal();
        f.eat();
        b.eat();
    }
}

 

上边程序的输出是:

Fishes must eat!

Birds must eat!