最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java工廠模式的深入了解

 更新時(shí)間:2022年01月05日 16:53:17   作者:空山新雨后~  
這篇文章主要為大家介紹了Java工廠模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

一、簡(jiǎn)單工廠模式

何為簡(jiǎn)單工廠模式?

首先先通過(guò)一個(gè)案例來(lái)理解

我有一個(gè)需求,要買車,買車有不同的型號(hào),那么我們常見(jiàn)的做法就是我買車點(diǎn)有什么車我就買什么車,實(shí)例如下

定義一個(gè)車接口

 
public interface Car {
    void name();
}

定義一個(gè)實(shí)現(xiàn)類,例如寶馬

public class Baoma implements Car {
 
    @Override
    public void name() {
        System.out.println("寶馬");
    }
}

測(cè)試

public class Test {
    public static void main(String[] args) {
        
        Car car3 = new Baoma();
        car3.name();

 結(jié)果:寶馬

很顯然這并不符合我們工廠設(shè)計(jì)模式的思想,我們不應(yīng)該讓用戶去new一個(gè)車出來(lái),現(xiàn)實(shí)生活中也不可能自己去new一個(gè)車然后自己買,對(duì)不對(duì),因此我們要設(shè)計(jì)一個(gè)簡(jiǎn)單的工廠來(lái)滿足我們的需求,

簡(jiǎn)單工廠類

public class CarFactory {
    public static Car getCar(String car) {
        if(car.equals("寶馬")) {
            return new Baoma();
        }else if(car.equals("奧迪")) {
            return new AoDI();
        }
        return null;
    }
}

測(cè)試

 Car car = CarFactory.getCar("寶馬");
        car.name();
 
        Car car1 = CarFactory.getCar("奧迪");
        car1.name();

結(jié)果:寶馬 奧迪

那么此時(shí)我們用戶就不需要去關(guān)心我們的車是怎么來(lái)的,車該怎么造出來(lái),造出來(lái)是什么車,我用戶只管從工廠中去拿出我們需要的車即可,如果沒(méi)有,再?gòu)墓S中去添加

         

該圖是對(duì)簡(jiǎn)單工廠模式的一個(gè)輔助理解。     

總結(jié)一下,簡(jiǎn)單工廠模式: 用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意產(chǎn)品(對(duì)于增加新的產(chǎn)品,需要覆蓋已有代碼)                  

二、工廠方法模式

那么在簡(jiǎn)單工廠類大家應(yīng)該發(fā)現(xiàn)了一個(gè)問(wèn)題,如果我們需要添加一輛新車,就需要進(jìn)入工廠修改工廠的代碼,如果我們修改了我們的代碼,那么久違反了我們?cè)O(shè)計(jì)模式的開(kāi)閉原則,不好,那么我們就來(lái)到了我們的工廠方法模式。

何為工廠方法模式,示例如下:

其中車類和車接口不變,我們改變一下車工廠

我們定義一個(gè)車接口,方法返回一輛車

public interface CarFactory {
    Car getCar();
}

那么我們可以想就是給每個(gè)車都配一個(gè)車工廠,那么添加的時(shí)候,只需要在新添加一個(gè)車工廠,去實(shí)現(xiàn)這個(gè)車工廠接口即可

奧迪工廠

public class AoDIFactory implements CarFactory{
 
    @Override
    public Car getCar() {
        return new AoDI();
    }
}

寶馬工廠我就不演示了。

測(cè)試

        Car baoma = new BaoMaFactory().getCar();
        Car Aodi = new AoDIFactory().getCar();
 
        baoma.name();
        Aodi.name();

 

那么此時(shí)如果我們要添加新車,我們只需要去添加他的車以及他的工廠即可,用戶則只需要去找對(duì)應(yīng)的工廠

 

總結(jié)一下,

工廠方法模式:用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的固定產(chǎn)品(支持增加任意產(chǎn)品)

三、抽象工廠模式

前面介紹的工廠方法模式中考慮的是一類產(chǎn)品的生產(chǎn),如畜牧場(chǎng)只養(yǎng)動(dòng)物、電視機(jī)廠只生產(chǎn)電視機(jī)、計(jì)算機(jī)軟件學(xué)院只培養(yǎng)計(jì)算機(jī)軟件專業(yè)的學(xué)生等。

同種類稱為同等級(jí),也就是說(shuō):工廠方法模式中只考慮生產(chǎn)同等級(jí)的產(chǎn)品,但是在現(xiàn)實(shí)生活中許多工廠是綜合型的工廠,能生產(chǎn)多等級(jí)(種類) 的產(chǎn)品,如農(nóng)場(chǎng)里既養(yǎng)動(dòng)物又種植物,電器廠既生產(chǎn)電視機(jī)又生產(chǎn)洗衣機(jī)或空調(diào),大學(xué)既有軟件專業(yè)又有生物專業(yè)等。

這里需要先了解一個(gè)定義:

產(chǎn)品族:將同一個(gè)具體工廠所生產(chǎn)的位于不同等級(jí)的一組產(chǎn)品稱為一個(gè)產(chǎn)品族

如圖所示

3.1、抽象工廠模式的定義

是一種為訪問(wèn)類提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對(duì)象接口,且訪問(wèn)類無(wú)須指定所要產(chǎn)品的具體類就能得到同族的不同等級(jí)的產(chǎn)品的模式結(jié)構(gòu)。

使用抽象工廠模式一般要滿足以下條件

可以在類的內(nèi)部對(duì)產(chǎn)品族中相關(guān)聯(lián)的多等級(jí)產(chǎn)品共同管理,而不必專門引入多個(gè)新的類來(lái)進(jìn)行管理。
當(dāng)需要產(chǎn)品族時(shí),抽象工廠可以保證客戶端始終只使用同一個(gè)產(chǎn)品的產(chǎn)品組
抽象工廠增強(qiáng)了程序的可擴(kuò)展性,當(dāng)增加一個(gè)新的產(chǎn)品族時(shí),不需要修改原代碼,滿足開(kāi)閉原則。

當(dāng)然使用抽象工廠模式也是有缺點(diǎn)的:        

當(dāng)產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品時(shí),所有的工廠類都需要進(jìn)行修改。增加了系統(tǒng)的抽象性和理解難度。

3.2、  抽象工廠模式的結(jié)構(gòu)

1. 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,它包含多個(gè)創(chuàng)建產(chǎn)品的方法 newProduct(),可以創(chuàng)建多個(gè)不同等級(jí)的產(chǎn)品。

2. 具體工廠(Concrete Factory):主要是實(shí)現(xiàn)抽象工廠中的多個(gè)抽象方法,完成具體產(chǎn)品的創(chuàng)建。

3. 抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能,抽象工廠模式有多個(gè)抽象產(chǎn)品。

4. 具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來(lái)創(chuàng)建,它同具體工廠之間是多對(duì)一的關(guān)系。

3.3抽象工廠模式代碼示例

首先我們?nèi)ザx抽象產(chǎn)品

比如

 * @Description 車接口
 */
public interface Car {
    void startCar();
    void stopCar();
    void washCar();
}
 * @Description 車載音響類
 */
public interface CarAudio {
    void startCarAudio();
    void stopCarAudio();
}

提供具體的產(chǎn)品

 * @Description 奧迪車
 */
public class AodiCar implements Car {
    @Override
    public void startCar() {
        System.out.println("啟動(dòng)奧迪車");
    }
 
    @Override
    public void stopCar() {
        System.out.println("關(guān)閉奧迪車");
    }
 
    @Override
    public void washCar() {
        System.out.println("洗奧迪車");
    }
}
 * @Description 奧迪車載音響
 */
public class AodiCarAudio implements CarAudio{
 
    @Override
    public void startCarAudio() {
        System.out.println("開(kāi)啟奧迪車載音響");
    }
 
    @Override
    public void stopCarAudio() {
        System.out.println("關(guān)閉奧迪車載音響");
    }
}
 * @Description 寶馬車
 */
public class BaomaCar implements Car{
    @Override
    public void startCar() {
        System.out.println("開(kāi)啟寶馬");
    }
 
    @Override
    public void stopCar() {
        System.out.println("停下寶馬");
    }
 
    @Override
    public void washCar() {
        System.out.println("洗寶馬");
    }
}
 * @Description 寶馬車載音響
 */
public class BaomaCarAudio implements CarAudio{
    @Override
    public void startCarAudio() {
        System.out.println("打開(kāi)寶馬車載音響");
    }
 
    @Override
    public void stopCarAudio() {
        System.out.println("關(guān)閉寶馬車載音響");
    }
}

提供抽象的工廠

 * @Description 產(chǎn)品工廠接口
 */
public interface ProductFactory {
    Car ProductCar();
    CarAudio ProductCarAudio();
}

提供具體的工廠

 * @Description 寶馬工廠
 */
public class BaomaFactory implements ProductFactory{
 
    @Override
    public Car ProductCar() {
        return new BaomaCar();
    }
 
    @Override
    public CarAudio ProductCarAudio() {
        return new BaomaCarAudio();
    }
}
 * @Description aodi工廠
 */
public class AodiFactory implements ProductFactory{
    @Override
    public Car ProductCar() {
        return new AodiCar();
    }
 
    @Override
    public CarAudio ProductCarAudio() {
        return new AodiCarAudio();
    }
}

客戶測(cè)試類

 * @Description 消費(fèi)者類
 */
public class Customer {
    public static void main(String[] args) {
        System.out.println("--------奧迪系列---------");
        //獲得奧迪工廠
        AodiFactory aodiFactory = new AodiFactory();
        Car car = aodiFactory.ProductCar();
        CarAudio carAudio = aodiFactory.ProductCarAudio();
        car.startCar();
        car.stopCar();
        carAudio.startCarAudio();
 
 
        System.out.println("--------寶馬系列---------");
 
        BaomaFactory baomaFactory = new BaomaFactory();
        Car carBaoma = baomaFactory.ProductCar();
        CarAudio carAudioBaoma = baomaFactory.ProductCarAudio();
        carBaoma.stopCar();
        carBaoma.washCar();
        carAudioBaoma.startCarAudio();
 
    }
}

輸出結(jié)果

        --------奧迪系列---------
啟動(dòng)奧迪車
關(guān)閉奧迪車
開(kāi)啟奧迪車載音響
--------寶馬系列---------
停下寶馬
洗寶馬
打開(kāi)寶馬車載音響

idea中類圖關(guān)系

如果我們要新增產(chǎn)品,需在總工廠去添加方法,而且其他的類也會(huì)修改,印證了我們之前寫到的缺點(diǎn),

總結(jié)一下:

抽象工廠模式就是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠,該超級(jí)工廠又稱為其他工廠的工廠

四、小結(jié)

工廠模式的核心本質(zhì)

實(shí)例化對(duì)象不使用new,用工廠方法代替

將選擇實(shí)現(xiàn)類,創(chuàng)建對(duì)象時(shí)統(tǒng)一管理和控制,從而將調(diào)用者跟我們的實(shí)現(xiàn)類解耦

簡(jiǎn)單工廠模式:用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的任意產(chǎn)品(對(duì)于增加新的產(chǎn)品,需要覆蓋已有代碼)

工廠方法模式:用來(lái)生產(chǎn)同一等級(jí)結(jié)構(gòu)中的固定產(chǎn)品(支持增加任意產(chǎn)品)

抽象工廠模式:圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠,該超級(jí)工廠又稱為其他工廠的工廠

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java控制臺(tái)輸出圖書館管理系統(tǒng)

    java控制臺(tái)輸出圖書館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java控制臺(tái)輸出圖書館管理系統(tǒng),只用java代碼不用數(shù)據(jù)庫(kù)和GUI等,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 詳解java==運(yùn)算符和equals()方法的區(qū)別

    詳解java==運(yùn)算符和equals()方法的區(qū)別

    這篇文章主要介紹了java==運(yùn)算符和equals()方法的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java SpringBoot 使用攔截器作為權(quán)限控制的實(shí)現(xiàn)方法

    Java SpringBoot 使用攔截器作為權(quán)限控制的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java SpringBoot 使用攔截器作為權(quán)限控制的實(shí)現(xiàn),文中通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • IDEA插件推薦之Maven-Helper的教程圖解

    IDEA插件推薦之Maven-Helper的教程圖解

    這篇文章主要介紹了IDEA插件推薦之Maven-Helper的相關(guān)知識(shí),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考
    2020-07-07
  • Java如何找出數(shù)組中重復(fù)的數(shù)字

    Java如何找出數(shù)組中重復(fù)的數(shù)字

    這篇文章主要為大家詳細(xì)介紹了Java如何找出數(shù)組中重復(fù)的數(shù)字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • springboot中一些比較常用的注解總結(jié)

    springboot中一些比較常用的注解總結(jié)

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著springboot中一些比較常用的注解展開(kāi),文中有非常詳細(xì)的總結(jié),需要的朋友可以參考下
    2021-06-06
  • SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn)

    SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn)

    MyBatis-Flex是一個(gè)基于MyBatis的數(shù)據(jù)訪問(wèn)框架,MyBatis-Flex能夠極大地提高我們的開(kāi)發(fā)效率和開(kāi)發(fā)體驗(yàn),本文主要介紹了SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 快速搭建一個(gè)SpringBoot項(xiàng)目(純小白搭建教程)

    快速搭建一個(gè)SpringBoot項(xiàng)目(純小白搭建教程)

    本文主要介紹了快速搭建一個(gè)SpringBoot項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java 實(shí)現(xiàn)隨機(jī)數(shù)組輸出及求和實(shí)例詳解

    java 實(shí)現(xiàn)隨機(jī)數(shù)組輸出及求和實(shí)例詳解

    這篇文章主要介紹了java 實(shí)現(xiàn)隨機(jī)數(shù)組輸出及求和實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • sms4j?2.0?全新來(lái)襲功能的調(diào)整及maven變化詳解

    sms4j?2.0?全新來(lái)襲功能的調(diào)整及maven變化詳解

    這篇文章主要介紹了sms4j?2.0?全新來(lái)襲功能的調(diào)整及maven變化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論

扎囊县| 纳雍县| 陆河县| 香港| 尖扎县| 农安县| 甘肃省| 海伦市| 姜堰市| 大宁县| 招远市| 北川| 曲松县| 山西省| 石阡县| 嘉峪关市| 雅安市| 平邑县| 图片| 兰溪市| 象山县| 龙陵县| 门源| 如皋市| 商水县| 承德市| 泗水县| 南雄市| 布尔津县| 霸州市| 香港 | 土默特左旗| 健康| 卫辉市| 太保市| 金塔县| 延长县| 乌恰县| 宁德市| 青铜峡市| 巴林左旗|