91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

反射與工廠設計模式的特點有哪些

發布時間:2021-10-14 11:52:08 來源:億速云 閱讀:176 作者:iii 欄目:編程語言

這篇文章主要介紹“反射與工廠設計模式的特點有哪些”,在日常操作中,相信很多人在反射與工廠設計模式的特點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”反射與工廠設計模式的特點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

反射與工廠設計模式

如果要想進行對象的實例化處理,除了可以使用關鍵字new之外,還可以使用反射機制來完成,于是此時一定會思考一個問題:為什么要提供有一個反射的實例化?那么到底是使用關鍵字new,還是使用反射呢?

如果要想更好的理解此類問題,最好的解決方案就是通過工廠設計模式來解決。

工廠模式的最大特點:客戶端的程序類不直接牽扯到對象的實例化管理,只與接口發生關聯,通過工廠類獲取指定接口的實例化對象。

范例:傳統的工廠設計模式

interface IMessage{public void send();  //消息發送}class NetMessage implements IMessage{public void send() {
        System.out.println("【網絡消息發送】www.mldn.cn");
    }
}public class JavaAPIDemo {public static void main(String[] args) throws Exception {
            IMessage msg = new NetMessage();  //如果直接實例化則一定會有耦合問題}
}

在實際的開發中,接口的主要作用是為不同層提供有一個操作的標準。但是如果此時直接將一個子類設置為接口實例化操作,那么一定會有耦合問題,所以使用了工廠設計模式來解決此問題。
范例:利用工廠設計模式解決

public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        IMessage msg = Factory.getInstance("netmessage");
        msg.send();   //【網絡消息發送】www.mldn.cn}
}interface IMessage{void send();  //消息發送}class NetMessage implements IMessage{public void send() {
        System.out.println("【網絡消息發送】www.mldn.cn");
    }
}class Factory{private Factory(){}  //沒有產生實例化對象的意義,所以構造方法私有化public static IMessage getInstance(String className){if("netmessage".equalsIgnoreCase(className)){return new NetMessage();
        }return null;
    }
}

反射與工廠設計模式的特點有哪些靜態工廠設計模式

此種工廠設計模式屬于靜態工廠設計模式,也就是說如果現在要追加一個子類,則意味著工廠類一定要做出修改,因為如果不追加判斷是無法獲取指定接口對象的。
范例:為IMessage追加一個子類

public class JavaAPIDemo {public static void main(String[] args) throws Exception {// IMessage msg = Factory.getInstance("netmessage");// msg.send();//【網絡消息發送】www.mldn.cnIMessage msg = Factory.getInstance("cloudmessage");
        msg.send();//【云消息發送】www.mldnjava.cn}
}interface IMessage{void send();  //消息發送}class NetMessage implements IMessage{@Overridepublic void send() {
        System.out.println("【網絡消息發送】www.mldn.cn");
    }
}class CloudMessage implements IMessage{@Overridepublic void send() {
        System.out.println("【云消息發送】www.mldnjava.cn");
    }
}class Factory{private Factory(){}public static IMessage getInstance(String className){if("netmessage".equalsIgnoreCase(className)){return new NetMessage();
        }else if("cloudmessage".equalsIgnoreCase(className)){return new CloudMessage();
        }return null;
    }
}

工廠設計模式最有效的解決的是子類與客戶端的耦合問題,但是解決的核心思想是在于提供了一個工廠類作為過渡端,但是隨著項目的進行,IMessage接口有可能會擁有更多的子類,而且隨著時間的推移,子類產生的可能會越來越多,那么此時就意味著,工廠類永遠都要進行修改,并且永無停止之日。

那么這時候最好的解決方案就是不使用關鍵字new來完成,因為關鍵字在new在使用時,需要有一個明確的類存在。而newInstance()方法只需要有一個明確表示類名稱的字符串即可。

public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        IMessage msg = Factory.getInstance("cn.mldn.demo.NetMessage");
        msg.send();  //【網絡消息發送】www.mldn.cn}
}interface IMessage{void send();  //消息發送}class NetMessage implements IMessage{public void send() {
        System.out.println("【網絡消息發送】www.mldn.cn");
    }
}class CloudMessage implements IMessage{@Overridepublic void send() {
        System.out.println("【云消息發送】www.mldnjava.cn");
    }
}class Factory{private Factory(){}public static IMessage getInstance(String className){
        IMessage instance = null;try {
            instance = (IMessage) Class.forName(className).getDeclaredConstructor().newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }return instance;
    }
}

這時可以發現,利用反射機制實現的工廠設計模式,最大的優勢在于:對于接口子類的擴充將不再影響到工廠類的定義。

但現在依然需要進一步思考,因為在實際的項目開發過程中,有可能會存在有大量的接口,并且這些接口都可能需要通過工廠類實例化,所以此時的工廠設計模式不應該只為IMessage接口服務,應該為所有接口服務。

public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        IMessage msg = Factory.getInstance("cn.mldn.demo.NetMessage",IMessage.class);
        msg.send();  //【網絡消息發送】www.mldn.cnIService service=Factory.getInstance("cn.mldn.demo.HouseService",IService.class);
        service.service();  //【服務】為您的住宿提供服務。}
}class Factory{private Factory(){}/**
     * 獲取接口實例化對象
     * @param className 接口的子類
     * @param clazz 描述的是一個接口的類型
     * @return 如果子類存在則返回指定接口的實例化對象
     */@SuppressWarnings("unchecked")public static <T> T getInstance(String className,Class<T> clazz){
        T instance=null;try {
            instance=(T) Class.forName(className).getDeclaredConstructor().newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }return instance;
    }
}interface IService{void service();
}class HouseService implements IService{@Overridepublic void service() {
        System.out.println("【服務】為您的住宿提供服務。");
    }
}interface IMessage{void send();//消息發送}class NetMessage implements IMessage{public void send() {
        System.out.println("【網絡消息發送】www.mldn.cn");
    }
}class CloudMessage implements IMessage{@Overridepublic void send() {
        System.out.println("【云消息發送】www.mldnjava.cn");
    }
}

反射與工廠設計模式的特點有哪些

此時的工廠模式將不再受限于指定的接口,可以為所有的接口提供實例化服務,達到可重用性。

到此,關于“反射與工廠設計模式的特點有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桂平市| 北海市| 阜平县| 邓州市| 上蔡县| 五河县| 卓资县| 高陵县| 台前县| 台湾省| 新余市| 延边| 肥城市| 曲阳县| 绵阳市| 桐城市| 灌阳县| 略阳县| 玉门市| 凤山市| 东乌珠穆沁旗| 井研县| 仁布县| 从江县| 庆云县| 延寿县| 井陉县| 兰坪| 阳西县| 武冈市| 阿拉善左旗| 淮南市| 曲周县| 自治县| 佛冈县| 霍城县| 阳春市| 达孜县| 泗洪县| 保康县| 同心县|