简单工厂模式
定义:又叫做静态工厂方法模式,通过定义专门一个类来负责创建
其他类的实例,而被创建的其他类实例一般具有共同的父类。
角色:分别为:工厂角色、抽象角色和具体实例角色。
通过对每个类实例的抽象,抽象出共同的父类(通常以接口的形式创建),作为抽象角色。然后再工厂角色中,根据传递的参数,创建具体类实例。
下面以具体的代码进行讲解:
首先来看下具体类:
例如:
public class Apple{
public void get(){
System.out.println("Apple");
}
}
public class Banana{
public void get(){
System.out.println("Banana");
}
}
上面定义了两个具体类分为苹果类和香蕉类。可以看到他们都有get方法,因此可以定义一个水果接口类,作为抽象角色。
类如:
public interface Fruit {
public void get();
}
下面修改下上面的具体类,使他们实现该抽象接口。
public class Apple implements Fruit{
public void get(){
System.out.println("Apple");
}
}
public class Banana implements Fruit{
public void get(){
System.out.println("Banana");
}
}
现在已经有了抽象角色和具体实例角色,还差工厂角色。那该如何创建工厂角色呢。请看下面的代码:
public class FruitFactory {
public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException {
if(type.equalsIgnoreCase("apple")) {
return Apple.class.newInstance();
} else if(type.equalsIgnoreCase("banana")) {
return Banana.class.newInstance();
} else {
System.out.println("找不到相应的实例化类");
return null;
}
}
}
那么,该如何调用呢,请看代码:
public class Test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Fruit apple = FruitFactory.getFruit("Apple");
Fruit banana = FruitFactory.getFruit("Banana");
apple.get();
banana.get();
}
}
上面介绍了简单工厂模式。但是工厂角色中创建实例的代码比较繁琐,我们可以更改为更为简单的方式,如下:
public class FruitFactory {
public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Class fruit = Class.forName(type);
return (Fruit) fruit.newInstance();
}
}
上面的代码虽然简洁,但是要注意调用的时候,参数要与具体类名一致。