工廠模式—簡單工廠模式(傳統,加反射)

簡單工廠模式:
核心:一個接口,一個繼承接口的集具體類,一個工廠類
本質:工廠類的生產產品實例根據創建實例時傳入參數的不同,動態的選擇應該創建哪一個具體類的實例。

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分支,而是在工廠類的生產產品實例的方法中接收一個產品類的名稱,在方法內部使用反射獲取該產品類的實例,這樣做無論增加多少產品類都不需要去修改工廠類的代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章