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

Java工廠模式之簡單工廠,工廠方法,抽象工廠模式詳解

 更新時間:2022年02月22日 16:23:29   作者:OASISHzzggg  
這篇文章主要為大家詳細介紹了Java工廠模式之簡單工廠、工廠方法、抽象工廠模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1、簡單工廠模式

1.定義

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

2.代碼案例

假設以罐頭產(chǎn)品的制造為案例

第一步:定義罐頭的頂層接口類ICanned

/**
 * @Package: com.hzg.study.design.pattern.factory.simplefactory
 * @Description: 罐頭頂層接口
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-17 17:52
 */
public interface ICanned {

    /**
     * 展示罐頭名稱
     * <p/>
     *
     * @return void
     * @author HuangZhiGao
     * @date 2022/2/17/017 17:54
     */
    void showCannedName();

}

第二步:分別編寫兩個具體的實現(xiàn)類FruitCannedBeefCanned

/**
 * @Package: com.hzg.study.design.pattern.factory.simplefactory
 * @Description: 水果罐頭
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-17 17:56
 */
public class FruitCanned implements ICanned {

    @Override
    public void showCannedName() {
        System.out.println("名稱:水果罐頭");
    }

}
/**
 * @Package: com.hzg.study.design.pattern.factory.simplefactory
 * @Description: 牛肉罐頭
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-17 17:57
 */
public class BeefCanned implements ICanned {

    @Override
    public void showCannedName() {
        System.out.println("名稱:牛肉罐頭");
    }

}

第三步:編寫工廠類

import com.hzg.study.design.pattern.factory.common.ICanned;

/**
 * @Package: com.hzg.study.design.pattern.factory.simplefactory
 * @Description: 罐頭工廠類
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-17 18:16
 */
public class CannedFactory {

    /**
     * 創(chuàng)建罐頭的方法
     * <p/>
     *
     * @param clazz
     * @return com.hzg.study.design.pattern.factory.common.ICanned
     * @author HuangZhiGao
     * @date 2022/2/17/017 18:18
     */
    public ICanned createCanned(Class<? extends ICanned> clazz) {
        if (null != clazz) {
            try {
                return clazz.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

}

第四步:main方法測試、查看類圖

import com.hzg.study.design.pattern.factory.common.BeefCanned;
import com.hzg.study.design.pattern.factory.common.FruitCanned;
import com.hzg.study.design.pattern.factory.common.ICanned;

/**
 * @Package: com.hzg.study.design.pattern.factory.simplefactory
 * @Description: 測試類
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-17 18:22
 */
public class SimpleFactoryTest {
    public static void main(String[] args) {
        CannedFactory cannedFactory = new CannedFactory();
        ICanned fruitCanned = cannedFactory.createCanned(FruitCanned.class);
        fruitCanned.showCannedName();
        System.out.println("----------------------------------------");
        ICanned beefCanned = cannedFactory.createCanned(BeefCanned.class);
        beefCanned.showCannedName();
    }
}

運行結果:

名稱:水果罐頭
----------------------------------------
名稱:牛肉罐頭

簡單工廠模式類圖:

簡單工廠模式類圖

3.適用場景

工廠類負責創(chuàng)建的對象較少,不需要關心創(chuàng)建對象的邏輯

4.優(yōu)缺點

優(yōu)點:

簡化了客戶端創(chuàng)建對象的過程

缺點:

1.工廠類職責相對較重,在一定程度上可能違背開閉原則(增加新的產(chǎn)品可能需要修改工廠類邏輯)
2.不易于擴展過于復雜的產(chǎn)品結構

2、工廠方法模式

1.定義

工廠方法模式(Factory Method Pattern)是指定義一個創(chuàng)建對象的接口,但讓實現(xiàn)這個接口的類來決定實例化哪個類,工廠方法讓類的實例化推遲到子類中進行。
屬于創(chuàng)建型設計模式。

2.代碼案例

需要使用到簡單工廠模式的ICanned、FruitCannedBeefCanned

第一步:定義罐頭工廠頂層接口類ICannedFactory

import com.hzg.study.design.pattern.factory.common.ICanned;

/**
 * @Package: com.hzg.study.design.pattern.factory.factorymethod
 * @Description: 罐頭工廠頂層接口
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 10:03
 */
public interface ICannedFactory {

    /**
     * 創(chuàng)建罐頭方法
     * <p/>
     *
     * @return void
     * @author HuangZhiGao
     * @date 2022/2/18/018 10:04
     */
    ICanned doCreateCanned();

}

第二步:分別編寫兩個具體的工廠實現(xiàn)類FruitCannedFactoryBeefCannedFactory

import com.hzg.study.design.pattern.factory.common.FruitCanned;
import com.hzg.study.design.pattern.factory.common.ICanned;

/**
 * @Package: com.hzg.study.design.pattern.factory.factorymethod
 * @Description: 水果罐頭工廠類
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 10:05
 */
public class FruitCannedFactory implements ICannedFactory {

    @Override
    public ICanned doCreateCanned() {
        return new FruitCanned();
    }

}
import com.hzg.study.design.pattern.factory.common.BeefCanned;
import com.hzg.study.design.pattern.factory.common.ICanned;

/**
 * @Package: com.hzg.study.design.pattern.factory.factorymethod
 * @Description: 牛肉罐頭工廠類
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 10:08
 */
public class BeefCannedFactory implements ICannedFactory {

    @Override
    public ICanned doCreateCanned() {
        return new BeefCanned();
    }

}

第三步:main方法測試、查看類圖

import com.hzg.study.design.pattern.factory.common.BeefCanned;
import com.hzg.study.design.pattern.factory.common.FruitCanned;
import com.hzg.study.design.pattern.factory.common.ICanned;

/**
 * @Package: com.hzg.study.design.pattern.factory.simplefactory
 * @Description: 測試類
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-17 18:22
 */
public class SimpleFactoryTest {
    public static void main(String[] args) {
        CannedFactory cannedFactory = new CannedFactory();
        ICanned fruitCanned = cannedFactory.createCanned(FruitCanned.class);
        fruitCanned.showCannedName();
        System.out.println("----------------------------------------");
        ICanned beefCanned = cannedFactory.createCanned(BeefCanned.class);
        beefCanned.showCannedName();
    }
}

運行結果:

名稱:水果罐頭
----------------------------------------
名稱:牛肉罐頭

工廠方法模式類圖:

工廠方法模式類圖

3.適用場景

創(chuàng)建對象需要大量重復的代碼。
客戶端(應用層)不依賴于產(chǎn)品類實例如何被創(chuàng)建、實現(xiàn)等細節(jié)。
一個類通過其子類來指定創(chuàng)建哪個對象。

4.優(yōu)缺點

優(yōu)點:

1.用戶只需關心所需產(chǎn)品對應的工廠,無須關心創(chuàng)建細節(jié)。
2.加入新產(chǎn)品符合開閉原則,提高了系統(tǒng)的可擴展性。

缺點:

1.類的個數(shù)容易過多,增加了代碼結構的復雜度。
2.增加了系統(tǒng)的抽象性和理解難度。

3、抽象工廠模式

1.定義

抽象工廠模式(Abstract Factory Pattern)是指提供一個創(chuàng)建一系列相關或相互依賴對象的接口,無須指定他們具體的類。
屬于創(chuàng)建型設計模式。

抽象工廠模式有產(chǎn)品族和產(chǎn)品等級的概念,可以通俗的理解為

產(chǎn)品族相當于不同品牌的產(chǎn)品合集,產(chǎn)品等級相當于不同品牌的同一種產(chǎn)品

例如:水果罐頭的材料信息、標簽信息組成了一個產(chǎn)品族,牛肉罐頭的材料信息、標簽信息組成了一個產(chǎn)品族

水果罐頭的材料信息、牛肉罐頭的材料信息組成一個產(chǎn)品等級,水果罐頭的標簽信息、牛肉罐頭的標簽信息組成一個產(chǎn)品等級

2.代碼案例

假設制造一個罐頭包含兩個部分(材料信息+標簽信息)

第一步:分別定義罐頭材料信息接口IMaterialInfo和罐頭標簽信息接口ITagInfo

/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description: 罐頭材料信息接口
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 10:51
 */
public interface IMaterialInfo {

    /**
     * 打印材料信息
     * <p/>
     *
     * @return void
     * @author HuangZhiGao
     * @date 2022/2/18/018 10:57
     */
    void printMaterialInfo();

}
/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description: 罐頭標簽信息接口
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 10:48
 */
public interface ITagInfo {

    /**
     * 打印標簽信息
     * <p/>
     *
     * @return void
     * @author HuangZhiGao
     * @date 2022/2/18/018 10:57
     */
    void printTagInfo();

}

第二步:定義罐頭的頂層工廠接口類ICannedFactory

/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description: 頂層工廠接口:一個罐頭包含兩個部分(材料信息+標簽信息)
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 10:47
 */
public interface ICannedFactory {

    IMaterialInfo createMaterialInfo();

    ITagInfo createTagInfo();

}

第三步:分別編寫具體實現(xiàn)類FruitMaterialInfoFruitTagInfoBeefMaterialInfo、BeefTagInfo

/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description:
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 11:05
 */
public class FruitMaterialInfo implements IMaterialInfo {

    @Override
    public void printMaterialInfo() {
        System.out.println("材料:水果");
    }

}
/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description:
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 11:05
 */
public class FruitTagInfo implements ITagInfo {

    @Override
    public void printTagInfo() {
        System.out.println("標簽:2022升級版水果罐頭");
    }

}
/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description:
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 11:05
 */
public class BeefMaterialInfo implements IMaterialInfo {

    @Override
    public void printMaterialInfo() {
        System.out.println("材料:牛肉");
    }

}
/** * @Package: com.hzg.study.design.pattern.factory.abstractfactory * @Description: * @Author: HuangZhiGao * @CreateDate: 2022-02-18 11:06 */public class BeefTagInfo implements ITagInfo {    @Override    public void printTagInfo() {        System.out.println("標簽:2022升級版牛肉罐頭");    }}/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description:
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 11:06
 */
public class BeefTagInfo implements ITagInfo {

    @Override
    public void printTagInfo() {
        System.out.println("標簽:2022升級版牛肉罐頭");
    }

}

第四步:分別編寫工廠具體實現(xiàn)類FruitCannedFactory、BeefCannedFactory

/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description:
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 11:04
 */
public class FruitCannedFactory implements ICannedFactory {

    @Override
    public IMaterialInfo createMaterialInfo() {
        return new FruitMaterialInfo();
    }

    @Override
    public ITagInfo createTagInfo() {
        return new FruitTagInfo();
    }

}
/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description:
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 11:04
 */
public class BeefCannedFactory implements ICannedFactory {

    @Override
    public IMaterialInfo createMaterialInfo() {
        return new BeefMaterialInfo();
    }

    @Override
    public ITagInfo createTagInfo() {
        return new BeefTagInfo();
    }

}

第五步:main方法測試、查看類圖

/**
 * @Package: com.hzg.study.design.pattern.factory.abstractfactory
 * @Description:
 * @Author: HuangZhiGao
 * @CreateDate: 2022-02-18 11:12
 */
public class AbstractFactoryTest {

    public static void main(String[] args) {
        ICannedFactory beefCannedFactory = new BeefCannedFactory();
        beefCannedFactory.createMaterialInfo().printMaterialInfo();
        beefCannedFactory.createTagInfo().printTagInfo();
        System.out.println("----------------------------------------");
        ICannedFactory fruitCannedFactory = new FruitCannedFactory();
        fruitCannedFactory.createMaterialInfo().printMaterialInfo();
        fruitCannedFactory.createTagInfo().printTagInfo();
    }

}

運行結果:

材料:牛肉
標簽:2022升級版牛肉罐頭
----------------------------------------
材料:水果
標簽:2022升級版水果罐頭

抽象工廠模式類圖:

抽象工廠模式類圖

3.適用場景

客戶端(應用層)不依賴于產(chǎn)品類實例如何被創(chuàng)建、實現(xiàn)等細節(jié)。
強調(diào)一系列相關的產(chǎn)品對象(屬于同一產(chǎn)品族)一起使用創(chuàng)建對象需要大量重復的代碼。
提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實現(xiàn)。

4.優(yōu)缺點

優(yōu)點:

1.具體產(chǎn)品在應用層代碼隔離,無須關心創(chuàng)建細節(jié)。
2.將一個系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建。

缺點:

1.規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品族中擴展新的產(chǎn)品困難,需要修改抽象工廠的接口。
2.增加了系統(tǒng)的抽象性和理解難度。

4、總結

簡單工廠、工廠方法和抽象工廠的區(qū)別:

工廠方法和抽象工廠是GOF23種設計模式中的兩種,簡單工廠不是一種設計模式,可以理解為是一種約定俗成的編碼習慣。

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

相關文章

  • java向文件末尾添加內(nèi)容示例分享

    java向文件末尾添加內(nèi)容示例分享

    本文為大家提供一個java向文件末尾添加內(nèi)容的示例分享,大家參考使用吧
    2014-01-01
  • Java實現(xiàn)字符串轉(zhuǎn)換成可執(zhí)行代碼的方法

    Java實現(xiàn)字符串轉(zhuǎn)換成可執(zhí)行代碼的方法

    今天小編就為大家分享一篇Java實現(xiàn)字符串轉(zhuǎn)換成可執(zhí)行代碼的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java如何替換字符

    Java如何替換字符

    文章介紹了Java中String類的replace()方法及其變體replaceFirst()的使用,包括如何替換單個字符、第一次出現(xiàn)的字符以及多個字符,通過示例展示了如何處理字符串中的特殊字符和空格
    2024-11-11
  • 詳解SpringMVC組件之HandlerMapping(二)

    詳解SpringMVC組件之HandlerMapping(二)

    這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(二),HandlerMapping組件是Spring?MVC核心組件,用來根據(jù)請求的request查找對應的Handler,在Spring?MVC中,有各式各樣的Web請求,每個請求都需要一個對應的Handler來處理,需要的朋友可以參考下
    2023-08-08
  • Java List與數(shù)組互轉(zhuǎn)方式

    Java List與數(shù)組互轉(zhuǎn)方式

    這篇文章主要介紹了Java List與數(shù)組互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java Random.nextInt()方法的具體使用

    java Random.nextInt()方法的具體使用

    這篇文章主要介紹了java Random.nextInt()方法的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • SpringBoot+Redis實現(xiàn)分布式緩存的方法步驟

    SpringBoot+Redis實現(xiàn)分布式緩存的方法步驟

    在高并發(fā)的分布式的系統(tǒng)中,緩存是提升系統(tǒng)性能的重要手段,本文主要介紹了SpringBoot+Redis實現(xiàn)分布式緩存的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Spring實戰(zhàn)之依賴關系注入之后的行為示例

    Spring實戰(zhàn)之依賴關系注入之后的行為示例

    這篇文章主要介紹了Spring實戰(zhàn)之依賴關系注入之后的行為,結合實例形式分析了Spring依賴關系注入之后的行為實現(xiàn)與使用相關操作技巧,需要的朋友可以參考下
    2019-11-11
  • 基于SpringBoot服務端表單數(shù)據(jù)校驗的實現(xiàn)方式

    基于SpringBoot服務端表單數(shù)據(jù)校驗的實現(xiàn)方式

    這篇文章主要介紹了基于SpringBoot服務端表單數(shù)據(jù)校驗的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Spring實戰(zhàn)之類級別緩存實現(xiàn)與使用方法

    Spring實戰(zhàn)之類級別緩存實現(xiàn)與使用方法

    這篇文章主要介紹了Spring實戰(zhàn)之類級別緩存實現(xiàn)與使用方法,結合實例形式分析了Spring類級別緩存配置、屬性、領域模型等相關操作技巧,需要的朋友可以參考下
    2020-01-01

最新評論

阜新| 蒲城县| 莲花县| 西乌| 大荔县| 田林县| 五莲县| 吉安县| 出国| 内江市| 巴彦淖尔市| 平江县| 手机| 雷州市| 沧州市| 宜城市| 邮箱| 喀喇| 墨竹工卡县| 天峻县| 秦安县| 东乌珠穆沁旗| 万荣县| 清水河县| 沅陵县| 米林县| 合水县| 扎囊县| 中卫市| 绥阳县| 玛多县| 望城县| 秭归县| 内黄县| 昌邑市| 象山县| 临洮县| 平原县| 林甸县| 霍城县| 黄冈市|