什么是工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。当我们定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
这样做的好处就是将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,明确了职责。并且扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
写法
步骤 1: 定义一个’果汁’接口
/**
* 创建果汁接口
* @author Evan
*/
public interface Juice {
/**
* 生产果汁方法
*/
void produce();
}
步骤 2: 创建’苹果汁’类,实现’果汁’接口
/**
* 创建苹果汁类,实现果汁接口
* @author Evan
*/
public class AppleJuice implements Juice {
/**
* 实现生产果汁的方法
* @author Evan
*/
@Override
public void produce() {
System.out.println("生产苹果汁");
}
}
步骤 3: 创建’橙汁’类,实现’果汁’接口
/**
* 创建橙汁类,实现果汁接口
* @author Evan
*/
public class OrangeJuice implements Juice {
@Override
public void produce() {
System.out.println("生产橙汁");
}
}
步骤 4: 创建’果汁’工厂类
/**
* 3.创建果汁工厂
* @author Evan
*/
public class JuiceFactory {
/**
* 根据不同的水果生产不同的果汁
*
* @param clazz 果汁的具体类型
* @param <T> 泛型
* @return 实例
*/
public static <T> T getJuice(Class<? extends T> clazz) {
T obj = null;
try {
// 反射生成具体实例
obj = (T) Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return obj;
}
}
测试一下
/**
* 测试工厂类
* @author Evan
*/
public class FactoryTest {
public static void main(String[] args) {
// 工厂生成苹果汁实例
AppleJuice appleJuice = JuiceFactory.getJuice(AppleJuice.class);
// 工厂生产橙汁实例
OrangeJuice juice = JuiceFactory.getJuice(OrangeJuice.class);
// 生产苹果汁
appleJuice.produce();
// 生产橙汁
juice.produce();
}
}
输出结果
生产苹果汁
生产橙汁
Process finished with exit code 0