简单工厂模式:
核心:一个接口,一个继承接口的集具体类,一个工厂类
本质:工厂类的生产产品实例根据创建实例时传入参数的不同,动态的选择应该创建哪一个具体类的实例。
interface IFruit{
public void eat();
}
//产品类
class Apple implements IFruit{
@Override
public void eat() {
System.out.println("eat apple!");
}
}
//工厂类
class FruitFactory{
private FruitFactory(){}
public static IFruit getInstance(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
if ("apple".equals(className)){
return new Apple();
}
return null;
}
}
public class FactoryDemo {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
IFruit fruit = FruitFactory.getInstance("Apple" );
fruit.eat();
}
}
缺陷:如果增加一个新产品(就是增加实现接口的继承类类),那就需要在工厂类的生产产品实例中修改代码,这样违反了开闭原则
这时可以引入反射:
class FruitFactory{
private FruitFactory(){}
public static IFruit getInstance(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//反射实现简单工厂模式
//这时不再需要在工厂类中修改代码,而是根据调用方法时传入类名
//再通过反射取得该类实例 这就动态的获得了不同的具体类对象
IFruit iFruit;
iFruit = (IFruit) Class.forName(className).newInstance();
return iFruit;
}
}
public class FactoryDemo {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
IFruit fruit = FruitFactory.getInstance("www.bite.reflect.Apple" );
fruit.eat();
}
}
当增加同一个新的产品类时,不需要再修改代码增加if-else分支,而是在工厂类的生产产品实例的方法中接收一个产品类的名称,在方法内部使用反射获取该产品类的实例,这样做无论增加多少产品类都不需要去修改工厂类的代码