Java 反射 -- 工廠模式的演變

準備些接口和類

public interface IMessage {
    void send();
}

public class NetMessage implements IMessage {
    @Override
    public void send() {
        System.out.println("由網(wǎng)絡發(fā)送消息");
    }
}

public class QueueMessage implements IMessage {
    @Override
    public void send() {
        System.out.println("由消息隊列發(fā)送消息");
    }
}

public interface ISay {
    void say();
}

public class Duck implements ISay {
    @Override
    public void say() {
        System.out.println("鴨子呱呱叫");
    }
}

接口直接實例化

public class JavaDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        IMessage message = new NetMessage();
        message.send();
    }
}

弊端:IMessage接口 與 NetMessage子類耦合

靜態(tài)工廠類

public class Factory {
    private static IMessage message = null;

    private Factory(){}

    public static IMessage getInstance(String className){
        if("NetMessage".equals(className)){
            message = new NetMessage();
        }else if("QueueMessage".equals(className)){
            message = new QueueMessage();
        }
        return message;
    }
}

public class JavaDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        IMessage message = Factory.getInstance("QueueMessage");
        message.send();
    }
}

弊端:當一個接口每多了一個子類,就需要在工廠類中添加一個對應的分支,不符合開閉原則(對于擴展是開放的,對于修改是關(guān)閉的)

為一個接口服務的工廠類(反射)

public class Factory {

    private Factory(){}

    public static IMessage getInstance(String className) {
        IMessage instance = null;
        try {
            instance = (IMessage) Class.forName(className).newInstance();
        } catch(Exception e){
            e.printStackTrace();
        }
        return instance;
    }
}

public class JavaDemo {
    public static void main(String[] args) throws Exception {
        IMessage message = Factory.getInstance("com.sheldon.demo.NetMessage");
        message.send();
    }
}

考慮:如果項目中有很多接口,是不是需要寫很過工廠類或者方法?。?/p>

為所有接口服務的工廠類(反射 + 泛型)

public class Factory {

    private Factory(){}

    public static <T> T getInstance(String className,Class<T> cls) {
        T instance = null;
        try {
            instance = (T) Class.forName(className).newInstance();
        } catch(Exception e){
            e.printStackTrace();
        }
        return instance;
    }
}

public class JavaDemo {
    public static void main(String[] args) throws Exception {
        IMessage message = Factory.getInstance("com.sheldon.demo.NetMessage",IMessage.class);
        message.send();
        ISay duck = Factory.getInstance("com.sheldon.demo.Duck",ISay.class);
        duck.say();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 文 | 晨妤兒 饅頭小妞 頓頓吃饃 口袋空空 熱氣騰騰出鍋的白胖胖 貧窮的小妞,喜歡白胖胖 一口咬下,軟軟的嘴唇 ...
    晨妤兒閱讀 129評論 0 1
  • 請問你幸福嗎? 什么是幸福?
    藍色麼麼閱讀 169評論 0 0
  • 那天偶然和王老師聊到“我執(zhí)”,都覺得知易行難,并不是易事。因為我的昵稱里面有個“空”字,現(xiàn)在仔細來看這個空字,上面...
    神奇少女空寶貝閱讀 413評論 0 0

友情鏈接更多精彩內(nèi)容