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

Java創(chuàng)建型設(shè)計模式之工廠方法模式深入詳解

 更新時間:2022年09月23日 15:07:45   作者:丨Jack_Chen丨  
工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計模式,此模式的核心精神是封裝類中變化的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復(fù)用和方便后期維護拓展的目的。它的核心結(jié)構(gòu)有四個角色,分別是抽象工廠、具體工廠、抽象產(chǎn)品、具體產(chǎn)品

簡單工廠模式

簡單工廠模式(Simple Factory Pattern)是指由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例,但是它不屬于設(shè)計模式。

簡單工廠適用于工廠類負責創(chuàng)建的對象較少的場景,且客戶端只需要傳入工廠類的參數(shù),對于如何創(chuàng)建對象的邏輯不需要關(guān)心。

定義產(chǎn)品對象

public interface ICar {
    void create();
}
public class BMCar implements ICar{
    @Override
    public void create(){
        System.out.println("制造BM車");
    }
}
public class ADCar implements ICar {
    @Override
    public void create() {
        System.out.println("制造AD車");
    }
}

創(chuàng)建工廠類

創(chuàng)建一個實現(xiàn)工廠類,所有的對象交由該工廠類創(chuàng)建

public class CarFactory {
    public ICar create(ICar car) {
        if (car instanceof BMCar) {
            return new BMCar();
        } else if (car instanceof ADCar) {
            return new ADCar();
        } else {
            return null;
        }
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create(new BMCar());
        bm.create();
        ICar ad = carFactory.create(new ADCar());
        ad.create();
    }

工廠使用反射

上述方式隨著業(yè)務(wù)擴展,就需要修改createAnimal方法中的邏輯代碼,不符合開閉原則。

可使用反射技術(shù),即使業(yè)務(wù)變化擴展,也不需要修改AnimalFactory中的邏輯代碼

public class CarFactory {
    public ICar create(String className) {
        try {
            if (!(null == className || "".equals(className))) {
                return (ICar) Class.forName(className).newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create("cn.ybzy.demo.BMCar");
        bm.create();
    }

上述方式的缺點是方法參數(shù)是字符串,有著不可控的風險??蛇M一步優(yōu)化,使用強制類型限制,控制參數(shù)傳遞

public class CarFactory {
    public ICar create(Class<? extends ICar> clazz) {
        try {
            if (!(null == clazz)) {
                return clazz.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        ICar bm = carFactory.create(BMCar.class);
        bm.create();
    }

工廠方法模式

概述

工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。工廠方法模式屬于創(chuàng)建型模式。

工廠模式(Factory Pattern)是Java中最常用的設(shè)計模式之一。它提供了一種創(chuàng)建對象的最佳方式。

它定義一個創(chuàng)建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創(chuàng)建過程延遲到子類進行。

在工廠方法模式中只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細節(jié),而且加入新的產(chǎn)品符合開閉原則。

應(yīng)用場景

1.創(chuàng)建對象需要大量重復(fù)的代碼。

2.客戶端(應(yīng)用層)不依賴于產(chǎn)品類實例如何被創(chuàng)建、實現(xiàn)等細節(jié)。

3.一個類通過其子類來指定創(chuàng)建哪個對象。

優(yōu)缺點

優(yōu)點:

1.一個調(diào)用者想創(chuàng)建一個對象,只需要知道其名稱就可以

2.擴展性高,如果想增加一個產(chǎn)品,只需要擴展一個工廠類

3.屏蔽產(chǎn)品的具體實現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口

缺點:

1.每增加一個產(chǎn)品時,都需要增加一個具體類和對象實現(xiàn)工廠,使系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴。

主要角色

1.抽象產(chǎn)品角色(Product)

工廠方法模式所創(chuàng)建的對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。

2.具體產(chǎn)品角色(Concrete Product)

這個角色實現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門的具體工廠創(chuàng)建,它們之間往往一一對應(yīng)。

3.抽象工廠角色(Creator)

是工廠方法模式的核心,與應(yīng)用程序無關(guān)。任何在模式中創(chuàng)建的對象的工廠類必須實現(xiàn)這個接口。

4.具體工廠角色(Concrete Creator)

這是實現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對象。

工廠方法模式的基本使用

創(chuàng)建抽象產(chǎn)品

創(chuàng)建抽象產(chǎn)品角色,工廠類所創(chuàng)建的產(chǎn)品的父類,封裝了產(chǎn)品對象的公共方法

public abstract class AbstractCar {
    public abstract void run();
}

創(chuàng)建具體產(chǎn)品

public class Car extends AbstractCar {
    public void run() {
        System.out.println("Car run");
    }
}

創(chuàng)建抽象工廠

public abstract class ICarFactory {
    public abstract <T> T create(Class<T> clazz);
}

創(chuàng)建具體工廠

創(chuàng)建多個實現(xiàn)抽象工廠接口的具體工廠類。負責實現(xiàn)創(chuàng)建產(chǎn)品的內(nèi)部邏輯,該工廠類可以被直接調(diào)用,創(chuàng)建所需的具體對象。

public class CarFactory extends ICarFactory {
    @Override
    public <T> T create(Class<T> clazz) {
        Car car;
        try {
            car = (Car) Class.forName(clazz.getName()).getConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return (T) car;
    }
}

客戶端執(zhí)行

通過一個工廠類,對實現(xiàn)了同一接口的一些類進行實例的創(chuàng)建

    public static void main(String[] args) {
        ICarFactory factory = new CarFactory();
        Car car = factory.create(Car.class);
        car.run();
    }

Car run

到此這篇關(guān)于Java創(chuàng)建型設(shè)計模式之工廠方法模式深入詳解的文章就介紹到這了,更多相關(guān)Java工廠方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用java對一副撲克牌建模

    使用java對一副撲克牌建模

    這篇文章主要為大家詳細介紹了如何使用java對一副撲克牌建模,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Spring?JDBC?框架簡介

    Spring?JDBC?框架簡介

    Spring?JDBC?提供幾種方法和數(shù)據(jù)庫中相應(yīng)的不同的類與接口。我將給出使用JdbcTemplate類框架的經(jīng)典和最受歡迎的方法。本文給大家介紹Spring?JDBC?框架的相關(guān)知識,感興趣的朋友一起看看吧
    2021-12-12
  • Java手機號最新校驗規(guī)則

    Java手機號最新校驗規(guī)則

    在Java中,進行手機號校驗通常使用正則表達式(Regex)來匹配手機號的格式,以下是一個基于當前(截至2024年)中國手機號規(guī)則的校驗方法,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Java項目開發(fā)命名規(guī)范(動力節(jié)點Java學(xué)院整理)

    Java項目開發(fā)命名規(guī)范(動力節(jié)點Java學(xué)院整理)

    定義這個規(guī)范的目的是讓項目中所有的文檔都看起來像一個人寫的,增加可讀性,減少項目組中因為換人而帶來的損失。下面給大家分享java開發(fā)命名規(guī)范,一起看看吧
    2017-03-03
  • SpringBoot項目使用協(xié)同過濾的實現(xiàn)

    SpringBoot項目使用協(xié)同過濾的實現(xiàn)

    協(xié)同過濾是一種常用的推薦系統(tǒng)算法,用于預(yù)測用戶可能喜歡的物品,本文主要介紹了SpringBoot項目使用協(xié)同過濾的實現(xiàn),感興趣的可以了解一下
    2023-09-09
  • SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類型)

    SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類型)

    這篇文章主要介紹了SpringBoot調(diào)第三方WebService接口的操作代碼(.wsdl與.asmx類型 ),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 淺談Java BitSet使用場景和代碼示例

    淺談Java BitSet使用場景和代碼示例

    這篇文章主要介紹了淺談Java BitSet使用場景和代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • ElasticSearch不停機重建索引延伸思考及優(yōu)化詳解

    ElasticSearch不停機重建索引延伸思考及優(yōu)化詳解

    這篇文章主要為大家介紹了ElasticSearch不停機重建索引延伸思考及優(yōu)化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Spring mvc是如何實現(xiàn)與數(shù)據(jù)庫的前后端的連接操作的?

    Spring mvc是如何實現(xiàn)與數(shù)據(jù)庫的前后端的連接操作的?

    今天給大家?guī)淼氖顷P(guān)于Spring mvc的相關(guān)知識,文章圍繞著Spring mvc是如何實現(xiàn)與數(shù)據(jù)庫的前后端的連接操作的展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java線程池使用及原理面試題

    java線程池使用及原理面試題

    很多面試官喜歡把線程池作為問題的起點,然后延伸到其它內(nèi)容,由于我們專欄已經(jīng)說過隊列、線程、鎖面試題了,所以本章面試題還是以線程池為主
    2022-03-03

最新評論

阿克苏市| 应用必备| 仲巴县| 巢湖市| 高青县| 永德县| 中宁县| 贵溪市| 牟定县| 宁城县| 修武县| 淮安市| 静宁县| 大庆市| 呼和浩特市| 沙洋县| 呼图壁县| 大英县| 东乡族自治县| 崇仁县| 荥经县| 子长县| 泰宁县| 嘉禾县| 凤庆县| 淮南市| 朝阳县| 靖州| 四会市| 德庆县| 建阳市| 彩票| 西昌市| 乐平市| 郎溪县| 石泉县| 都江堰市| 沂源县| 通山县| 林甸县| 玉环县|