工厂方法模式是在简单工厂模式的基础上提出来的。在简单工厂模式中由于工厂类只有一个静态方法,当系统中需要创建一个新的类时,为了让这个工厂类继续工作,必须在工厂类的静态方法里边添加新的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!