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

準備些接口和類

public interface IMessage {
    void send();
}

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

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

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子類耦合

靜態工廠類

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();
    }
}

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

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

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();
    }
}

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

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

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();
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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