溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

反射與工廠設(shè)計(jì)模式的特點(diǎn)有哪些

發(fā)布時(shí)間:2021-10-14 11:52:08 來(lái)源:億速云 閱讀:169 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“反射與工廠設(shè)計(jì)模式的特點(diǎn)有哪些”,在日常操作中,相信很多人在反射與工廠設(shè)計(jì)模式的特點(diǎn)有哪些問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”反射與工廠設(shè)計(jì)模式的特點(diǎn)有哪些”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

反射與工廠設(shè)計(jì)模式

如果要想進(jìn)行對(duì)象的實(shí)例化處理,除了可以使用關(guān)鍵字new之外,還可以使用反射機(jī)制來(lái)完成,于是此時(shí)一定會(huì)思考一個(gè)問(wèn)題:為什么要提供有一個(gè)反射的實(shí)例化?那么到底是使用關(guān)鍵字new,還是使用反射呢?

如果要想更好的理解此類問(wèn)題,最好的解決方案就是通過(guò)工廠設(shè)計(jì)模式來(lái)解決。

工廠模式的最大特點(diǎn):客戶端的程序類不直接牽扯到對(duì)象的實(shí)例化管理,只與接口發(fā)生關(guān)聯(lián),通過(guò)工廠類獲取指定接口的實(shí)例化對(duì)象。

范例:傳統(tǒng)的工廠設(shè)計(jì)模式

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

在實(shí)際的開(kāi)發(fā)中,接口的主要作用是為不同層提供有一個(gè)操作的標(biāo)準(zhǔn)。但是如果此時(shí)直接將一個(gè)子類設(shè)置為接口實(shí)例化操作,那么一定會(huì)有耦合問(wèn)題,所以使用了工廠設(shè)計(jì)模式來(lái)解決此問(wèn)題。
范例:利用工廠設(shè)計(jì)模式解決

public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        IMessage msg = Factory.getInstance("netmessage");
        msg.send();   //【網(wǎng)絡(luò)消息發(fā)送】www.mldn.cn}
}interface IMessage{void send();  //消息發(fā)送}class NetMessage implements IMessage{public void send() {
        System.out.println("【網(wǎng)絡(luò)消息發(fā)送】www.mldn.cn");
    }
}class Factory{private Factory(){}  //沒(méi)有產(chǎn)生實(shí)例化對(duì)象的意義,所以構(gòu)造方法私有化public static IMessage getInstance(String className){if("netmessage".equalsIgnoreCase(className)){return new NetMessage();
        }return null;
    }
}

反射與工廠設(shè)計(jì)模式的特點(diǎn)有哪些靜態(tài)工廠設(shè)計(jì)模式

此種工廠設(shè)計(jì)模式屬于靜態(tài)工廠設(shè)計(jì)模式,也就是說(shuō)如果現(xiàn)在要追加一個(gè)子類,則意味著工廠類一定要做出修改,因?yàn)槿绻蛔芳优袛嗍菬o(wú)法獲取指定接口對(duì)象的。
范例:為IMessage追加一個(gè)子類

public class JavaAPIDemo {public static void main(String[] args) throws Exception {// IMessage msg = Factory.getInstance("netmessage");// msg.send();//【網(wǎng)絡(luò)消息發(fā)送】www.mldn.cnIMessage msg = Factory.getInstance("cloudmessage");
        msg.send();//【云消息發(fā)送】www.mldnjava.cn}
}interface IMessage{void send();  //消息發(fā)送}class NetMessage implements IMessage{@Overridepublic void send() {
        System.out.println("【網(wǎng)絡(luò)消息發(fā)送】www.mldn.cn");
    }
}class CloudMessage implements IMessage{@Overridepublic void send() {
        System.out.println("【云消息發(fā)送】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;
    }
}

工廠設(shè)計(jì)模式最有效的解決的是子類與客戶端的耦合問(wèn)題,但是解決的核心思想是在于提供了一個(gè)工廠類作為過(guò)渡端,但是隨著項(xiàng)目的進(jìn)行,IMessage接口有可能會(huì)擁有更多的子類,而且隨著時(shí)間的推移,子類產(chǎn)生的可能會(huì)越來(lái)越多,那么此時(shí)就意味著,工廠類永遠(yuǎn)都要進(jìn)行修改,并且永無(wú)停止之日。

那么這時(shí)候最好的解決方案就是不使用關(guān)鍵字new來(lái)完成,因?yàn)殛P(guān)鍵字在new在使用時(shí),需要有一個(gè)明確的類存在。而newInstance()方法只需要有一個(gè)明確表示類名稱的字符串即可。

public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        IMessage msg = Factory.getInstance("cn.mldn.demo.NetMessage");
        msg.send();  //【網(wǎng)絡(luò)消息發(fā)送】www.mldn.cn}
}interface IMessage{void send();  //消息發(fā)送}class NetMessage implements IMessage{public void send() {
        System.out.println("【網(wǎng)絡(luò)消息發(fā)送】www.mldn.cn");
    }
}class CloudMessage implements IMessage{@Overridepublic void send() {
        System.out.println("【云消息發(fā)送】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;
    }
}

這時(shí)可以發(fā)現(xiàn),利用反射機(jī)制實(shí)現(xiàn)的工廠設(shè)計(jì)模式,最大的優(yōu)勢(shì)在于:對(duì)于接口子類的擴(kuò)充將不再影響到工廠類的定義。

但現(xiàn)在依然需要進(jìn)一步思考,因?yàn)樵趯?shí)際的項(xiàng)目開(kāi)發(fā)過(guò)程中,有可能會(huì)存在有大量的接口,并且這些接口都可能需要通過(guò)工廠類實(shí)例化,所以此時(shí)的工廠設(shè)計(jì)模式不應(yīng)該只為IMessage接口服務(wù),應(yīng)該為所有接口服務(wù)。

public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        IMessage msg = Factory.getInstance("cn.mldn.demo.NetMessage",IMessage.class);
        msg.send();  //【網(wǎng)絡(luò)消息發(fā)送】www.mldn.cnIService service=Factory.getInstance("cn.mldn.demo.HouseService",IService.class);
        service.service();  //【服務(wù)】為您的住宿提供服務(wù)。}
}class Factory{private Factory(){}/**
     * 獲取接口實(shí)例化對(duì)象
     * @param className 接口的子類
     * @param clazz 描述的是一個(gè)接口的類型
     * @return 如果子類存在則返回指定接口的實(shí)例化對(duì)象
     */@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("【服務(wù)】為您的住宿提供服務(wù)。");
    }
}interface IMessage{void send();//消息發(fā)送}class NetMessage implements IMessage{public void send() {
        System.out.println("【網(wǎng)絡(luò)消息發(fā)送】www.mldn.cn");
    }
}class CloudMessage implements IMessage{@Overridepublic void send() {
        System.out.println("【云消息發(fā)送】www.mldnjava.cn");
    }
}

反射與工廠設(shè)計(jì)模式的特點(diǎn)有哪些

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

到此,關(guān)于“反射與工廠設(shè)計(jì)模式的特點(diǎn)有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI