Java是面向对象的编程语言,说到对象,不可避免的就是创建对象,java创建对象是通过new操作符来创建类的实例。本文所讲的简单工厂模式就属于类的创建型模式,又叫静态工厂模式。
什么是简单工厂模式?简单工厂模式的概念是什么?
简单工厂模式属于类的创建型模式,又叫静态工厂模式,通常会专门定义一个类来负责创建其他类的实例,也正因此被创建的类实例都会具有共同的父类。
举一个简单的例子:
创建一个Apple类、Banana类,定义它们的get方法
public class Apple {
public void get() {
System.out.println("采集苹果");
}
}
public class Banana {
public void get() {
System.out.println("采集香蕉");
}
}
因为Apple、Banana属于水果,因此再创建一个Fruit接口,将Apple、Banana类中具体的get()抽离出来(此处也是java三大特性--多态的具体应用场景):
/**
* 将Apple、Banana抽象成Fruit接口
* @author
*
*/
public interface Fruit {
public void get();
}
有了Fruit接口后,将Apple、Banana两个类实现Fruit接口,创建Apple、Banana实例:
Fruit apple = new Apple();
Fruit banana = new Banana();
apple.get();
banana.get();
如果再多出一个葡萄类,那么创建葡萄实例也必须通过new操作符类实现,这个时候就在想我们能否只创建一个类,这个类就负责专门用来创建其他类的实例,即创建其他所有类实例的逻辑在这个类里实现,外部只需直接调用这个类的内部实现方法就能创建所需的类实例,外部调用并不显示创建对象的具体内部逻辑。由此引出了简单工厂模式中的一个非常重要的角色:工厂角色。工厂角色是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,工厂类可以直接被外部调用,创建所需的实例。
创建工厂类:
public class FruitFactory {
//1.创建Apple实例的实现逻辑
public static Fruit getApple() {
return new Apple();
}
//2.创建Banana实例的实现逻辑
public static Fruit getBanana() {
return new Banana();
}
}
外部直接引用这个工厂类,调用其内部的静态方法,就能实现创建对象的具体操作
//引用工厂类,调用静态方法,创建对象
Fruit apple = FruitFactory.getApple();
Fruit banana = FruitFactory.getBanana();
apple.get();
banana.get();
由上述代码不难看出,外部的调用并没有暴露对象创建的内部逻辑,因为对象的创建是由工厂类统一负责实现。
到此为止,一个简单工厂模式已经初步成型。正如前文所述,如需再创建一个葡萄实例,那就不得不在这个工厂类里添加创建Grape实例的实现逻辑,此时FruitFactory工厂类的可扩展性是很差的,因此还要对FruitFactory工厂类进行代码可扩展性的优化。
考虑能否在这个工厂类里只写一个创建实例的具体实现,不管外部需要创建哪个具体类的对象,在工厂类里只需根据外部给定的具体信息作必要的判断逻辑就能创建所需的对象?可以对FruitFactory这个工厂类代码作如下优化:
public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
if(type.equalsIgnoreCase("apple")) {
return Apple.class.newInstance();
} else if(type.equalsIgnoreCase("banana")) {
return Banana.class.newInstance();
} else {
System.out.println("找不到对应的产品类");
return null;
}
}
public static Fruit getFruit(String type) throws ClassNotFoundException {
Class fruit = Class.forName(type);
return (Fruit) fruit.newInstance();
}