简单工厂模式是23种模式中最简单的模式,主要用于对象的创建。该模式可以使客户端省去创建不同对象的代码,而把对象的创建交给专门的工厂类。需要注意的是使用这种模式创建的类必须继承自相同的类,否则无法返回创建的对象。工厂类提供一个静态的方法,通过传递不同的参数给这个方法来返回需要的对象。
下边是简单工厂模式的示例代码,注意这段代码并没有让Fish类和Bird类继承同一个类,而是让他们都实现IAnimal接口,通过这个接口来取得创建的对象。
Fish类的代码:
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!");
}
}
Bird类的代码:
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!");
}
}
IAnimal接口只是一个简单的方法的声明:
public interface IAnimal {
public void eat();
}
最后给出AnimalFactory类的代码:
public class AnimalFactory {
public static IAnimal returnAnimal(String animalName){
if("fish".equals(animalName)){
return new Fish();
}else if("bird".equals(animalName)){
return new Bird();
}
return null;
}
}
下边测试简单工厂模式:
public class Test {
public static void main(String[] args) {
IAnimal fish=AnimalFactory.returnAnimal("fish");
fish.eat();
IAnimal bird=AnimalFactory.returnAnimal("bird");
bird.eat();
}
}
这边程序的输出是:
Fishes must eat!
Birds must eat!
测试成功!
简单工厂模式使客户端不再负责对象的创建,而把这个工作交给专门的工厂类,这样既明确了分工,也使代码的编写更加的容易。但是简单工厂模式的缺点也是显而易见的,虽然客户端不在负责对象的创建,但是创建对象的代码并没有因此而减少,只是把他们集中在一个类的静态方法里边,当要创建的对象较多时,工厂类的代码会很长,而且都是一些相似的代码,就像上边列出的一样,创建Bird对象和创建Fish对象唯一的不同在于new后边的类名不一样。
另外,当我们要给不同的类提供不同的初始值的时候,也就是说当类的构造函数需要不同数目或者不同类型的参数时,简单工厂模式就显示的力不从心了。简单工厂模式适用于要创建的对象比较简单的情形。需要注意的是,简单工厂模式使用了面向对象的多态性,这种多态性既可以使用类,也可使接口。