簡單工廠模式:
核心:一個接口,一個繼承接口的集具體類,一個工廠類
本質:工廠類的生產產品實例根據創建實例時傳入參數的不同,動態的選擇應該創建哪一個具體類的實例。
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分支,而是在工廠類的生產產品實例的方法中接收一個產品類的名稱,在方法內部使用反射獲取該產品類的實例,這樣做無論增加多少產品類都不需要去修改工廠類的代碼