大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 靜態(tài)工廠模式的介紹

靜態(tài)工廠模式的介紹

更新時(shí)間:2022-11-24 10:00:59 來源:動(dòng)力節(jié)點(diǎn) 瀏覽929次

靜態(tài)工廠模式是一種改進(jìn)的獲取實(shí)例的方法。

通常我們會(huì)使用new關(guān)鍵字調(diào)用類的構(gòu)造方法來創(chuàng)建一個(gè)對(duì)象,靜態(tài)工廠模式相對(duì)于傳統(tǒng)的創(chuàng)建對(duì)象的方式有以下優(yōu)點(diǎn):

1. 可以更加富有語義的創(chuàng)建實(shí)例:

當(dāng)一個(gè)類的構(gòu)造方法有非常多的參數(shù)或被重載過很多次的話,因?yàn)镴AVA對(duì)構(gòu)造方法命名的規(guī)定(與類名相同),我們必須編寫多個(gè)命名相同但實(shí)際不同的構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)很難區(qū)分我們應(yīng)該調(diào)用哪個(gè)構(gòu)造方法。

比如在實(shí)際生產(chǎn)中,我們會(huì)經(jīng)常見到以下方法:

newInstance():獲取一個(gè)新的對(duì)象

valueOf():獲取一個(gè)值為..的對(duì)象

getInstance():獲取一個(gè)對(duì)象緩存池中的對(duì)象或單例對(duì)象

甚至我們可以更加細(xì)分,比如有一個(gè)Person類,我們想根據(jù)年齡來獲取不同的對(duì)象,則可有如下靜態(tài)工廠方法:

getChild():獲取一個(gè)兒童對(duì)象

getOld():獲取一個(gè)老年對(duì)象

getYouth():獲取一個(gè)青年對(duì)象

等等,比起new關(guān)鍵字,顯然使用上述方法獲取對(duì)象更加具有可讀性,使我們對(duì)創(chuàng)造的實(shí)例類型更可控。

2. 不必每次調(diào)用都創(chuàng)建新的對(duì)象

當(dāng)一個(gè)類的對(duì)象會(huì)被頻繁使用,且沒有必要在每次使用時(shí)都生成新的對(duì)象時(shí),我們會(huì)考慮使用單例模式。單例模式大多是由靜態(tài)工廠實(shí)現(xiàn)的,我們可以在工廠內(nèi)部控制新生成實(shí)例或返回已有實(shí)例。

比如,DCL單例模式獲取對(duì)象時(shí)就是采用了靜態(tài)工廠:

public class Car {
    //構(gòu)造函數(shù)私有,禁止通過常規(guī)方式實(shí)例化
    private Car(){}
    //單例對(duì)象的引用
    static volatile Car car=null;
    //DCL獲取單例對(duì)象,靜態(tài)工廠方法
    static Car getInstance(){
        if(car==null){
            synchronized(Car.class){
                if(car==null){
                    car=new Car();
                }
            }
        }
        return car;
    }
    private Object readResolve() {
        return getCar();
    }
}

3. 可以返回原返回類型的子類

我們可以通過靜態(tài)工廠返回一個(gè)類型的所有子類,可以更加靈活的獲取實(shí)例。這也符合了兩大設(shè)計(jì)原則:里氏替換原則與依賴倒置原則。即所有父類可以出現(xiàn)的地方子類也可以出現(xiàn),以及類的使用方不應(yīng)該依賴具體的實(shí)現(xiàn)類,而應(yīng)該依賴?yán)^承鏈的頂端(接口或抽象類),即依賴抽象。

從Car中我們可以獲取Bus和Taxi兩個(gè)子類的實(shí)例,其它類在使用時(shí)只需維護(hù)一個(gè)Car的引用,至于具體用Bus還是用Taxi只由獲取實(shí)例的那行代碼決定,我們可以在只更換實(shí)例的獲取而不改變其它代碼(業(yè)務(wù)邏輯)的情況下修改代碼。

public class Car{
    public static Car getBus(){
        return new Bus();
    }
    public static Car getTaxi(){
        return new Taxi();
    }
}
public class bus extends Car{
}
public class taxi extends Car{
}

4. 在創(chuàng)建帶泛型的參數(shù)時(shí),使代碼更簡潔

這條主要是針對(duì)帶泛型類的繁瑣聲明而說的,需要重復(fù)書寫兩次泛型參數(shù):

  Map<String,Date> map = new HashMap<String,Date>();

不過自從 java7 開始,這種方式已經(jīng)被優(yōu)化過了 —— 對(duì)于一個(gè)已知類型的變量進(jìn)行賦值時(shí),由于泛型參數(shù)是可以被推導(dǎo)出,所以可以在創(chuàng)建實(shí)例時(shí)省略掉泛型參數(shù)。

  Map<String,Date> map = new HashMap<>();

所以這個(gè)問題實(shí)際上已經(jīng)不存在了。大家如果想了解更多相關(guān)知識(shí),不妨來關(guān)注一下本站的Java設(shè)計(jì)模式,里面還有更豐富的知識(shí)等著大家去學(xué)習(xí),相信對(duì)大家一定能夠有所幫助。

提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久精品国产74国产 | 特黄特色一级aa毛片免费观看 | 久久影院国产 | 日韩亚洲人成在线综合 | 中文字幕热久久久久久久 | 美女做羞羞 | 国内第一永久免费福利视频 | 国产精品久久久久久久久夜色 | 欧美整片在线观看 | 噜鲁射图片 | 九九免费在线视频 | 99久久国产综合精品2020 | 日本欧美在线观看 | 青青草一区二区免费精品 | 九九视频九九热 | 青青热在线观看视频精品 | 免费一级毛片在线播放欧美 | 久久影院朴妮唛 | 日韩欧美一区二区久久黑人 | 黄色影院 | 2021国产精品自产拍在线观看 | 色播影院性播影院私人影吧 | 伊人亚洲综合网 | 伊人99在线观看 | 宅男影院在线 | aⅴ免费在线观看 | 在线观看视频一区二区 | 日本在线不卡免 | 日日夜人人澡人人澡人人看免 | 玖玖精品 | 亚洲三级在线免费观看 | 国产成人综合久久精品红 | 手机免费在线观看 | 久久综合久久久 | a级毛片高清免费视频 | 99r8这里精品热视频免费看 | 月婷婷色狠狠 | 亚洲精国产一区二区三区 | 欧美日韩国产一区二区三区欧 | 日日夜夜免费视频 | 中文在线亚洲 |