溫馨提示×

溫馨提示×

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

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

Java工廠方法模式怎么實現(xiàn)

發(fā)布時間:2022-04-02 13:50:06 來源:億速云 閱讀:154 作者:iii 欄目:編程語言

這篇文章主要講解了“Java工廠方法模式怎么實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java工廠方法模式怎么實現(xiàn)”吧!

Java工廠方法模式怎么實現(xiàn)


一、什么是工廠方法模式?

工廠方法模式:也叫虛擬構(gòu)造器模式或者多態(tài)工廠模式,它屬于類創(chuàng)建型模式。

在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類。

我們知道在現(xiàn)在的真實工廠內(nèi)分工越來越細(xì),越來越專業(yè)化。。各種產(chǎn)品有專門的工廠生產(chǎn),徹底告別了自給自足的小農(nóng)經(jīng)濟時代,這大大縮短了產(chǎn)品的生產(chǎn)周期,提高了生產(chǎn)效率。而工廠方法模式即滿足了開閉原則,也繼承了簡單工廠模式的優(yōu)點。

舉例說明:

在簡單工廠模式的文章中的可樂工廠,因為只有一個工廠類,所以任何產(chǎn)品都需要在這個類里面去修改和調(diào)整,而工廠方法模式就是有多個工廠,每個工廠生產(chǎn)一個產(chǎn)品,如果有需要增加新產(chǎn)品,我們直接再新建一個工廠即可,就不需要在其他工廠的內(nèi)部再去修改,這樣就符合了開閉原則。

二、工廠方法模式的優(yōu)缺點

優(yōu)點:

  • 用戶只需要知道具體工廠的名稱就可得到所要的產(chǎn)品,無須知道產(chǎn)品的具體創(chuàng)建過程

  • 靈活性增強,對于新產(chǎn)品的創(chuàng)建,只需多寫一個相應(yīng)的工廠類

  • 典型的解耦框架。高層模塊只需要知道產(chǎn)品的抽象類,無須關(guān)心其他實現(xiàn)類,滿足迪米特法則、依賴倒置原則和里氏替換原則

缺點:

  • 類的個數(shù)容易過多,增加復(fù)雜度

  • 增加了系統(tǒng)的抽象性和理解難度

  • 抽象產(chǎn)品只能生產(chǎn)一種產(chǎn)品,此弊端可使用抽象工廠模式解決(抽象工廠模式在下一篇文章)

三、模式的結(jié)構(gòu)與實現(xiàn)

結(jié)構(gòu)由以下四個部分組成:

  • 抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過它訪問具體工廠的工廠方法 newProduct() 來創(chuàng)建產(chǎn)品

  • 具體工廠(ConcreteFactory):主要是實現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建

  • 抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能

  • 具體產(chǎn)品(ConcreteProduct):實現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間一一對應(yīng)

結(jié)構(gòu)圖:

Java工廠方法模式怎么實現(xiàn)

4、工廠方法模式代碼實現(xiàn)

還是以上一篇文章的可樂工廠為例:
產(chǎn)品有:可口可樂、百事可樂、無糖可樂
在簡單工廠模式中只有一個可樂工廠,可以生產(chǎn)三種產(chǎn)品,在工廠方法模式中就可以有多個工廠來生成對應(yīng)的產(chǎn)品:

抽象工廠: 可樂工廠(可以理解成總廠)
百事可樂工廠: 生成百事可樂
可口可樂工廠: 生成可口可樂
無糖可樂工廠: 生成無糖可樂

生產(chǎn)可樂的方法:

/**
 *  提供了產(chǎn)品的接口
 */public interface Cola {

    //生產(chǎn)可樂的方法
    public void cola();}

可樂抽象工廠:

/**
 * 可樂抽象工廠(可以理解成可樂總廠,旗下還有很多分廠)
 */public interface ColaFactory {

    public Cola newCola();}

生成三種可樂的方法:
可樂可樂:

/**
 * 產(chǎn)品名稱:可樂可樂,實現(xiàn)了產(chǎn)品的接口
 */public class CocaCola implements Cola{

    @Override
    public void cola() {
        System.out.println("開始生產(chǎn)可口可樂");
    }}

百事可樂:

/**
 *
 * 產(chǎn)品名稱:百事可樂,實現(xiàn)了產(chǎn)品的接口
 */public class PepsiCola implements Cola{

    @Override
    public void cola() {
        System.out.println("開始生產(chǎn)百事可樂");
    }}

無糖可樂:

/*
 * 產(chǎn)品名稱:無糖可樂,實現(xiàn)了產(chǎn)品的接口
 */public class SugarFreeCola implements Cola{

    @Override
    public void cola() {
        System.out.println("開始生產(chǎn)無糖可樂");
    }}

三個產(chǎn)品對應(yīng)三個工廠:

生產(chǎn)可口可樂的工廠:

/**
 *
 * 具體工廠1:可口可樂工廠
 */public class CocaColaFactory implements ColaFactory{
    
    @Override
    public Cola newCola() {
        System.out.println("我是可樂工廠下面的可口可樂工廠");
        return new CocaCola();
    }}

生產(chǎn)百事可樂的工廠:

/**
 *
 * 具體工廠2:百事可樂工廠
 */public class PepsiColaFactory implements ColaFactory{

    @Override
    public Cola newCola() {
        System.out.println("我是可樂工廠下面的百事可樂工廠");
        return new PepsiCola();
    }}

生產(chǎn)無糖可樂的工廠:

/*
 * 具體工廠3:無糖可樂工廠
 */public class SugarFreeColaFactory implements ColaFactory{
    
    @Override
    public Cola newCola() {
        System.out.println("我是可樂工廠下面的無糖可樂工廠");
        return new SugarFreeCola();
    }}

到這里目前有:

  • 一生產(chǎn)可樂的方法

  • 一個可樂工廠(下面有多個小工廠)

  • 三個生產(chǎn)三種類型可樂的方法(實現(xiàn)可樂接口)

  • 三個可樂工廠(生產(chǎn)三種可樂,實現(xiàn)可樂工廠接口)

測試類:

public class Test {
    public static void main(String[] args) {

        try{

            //新建一個可樂方法對象
            Cola a;

            //新建一個可樂工廠對象
            ColaFactory af;

            //告訴可樂工廠,你需要什么可樂,并且通知對應(yīng)的分工廠
            af = (ColaFactory) new PepsiColaFactory();
            //執(zhí)行對于生產(chǎn)方法
            a = af.newCola();
            a.cola();
            
        }catch (Exception e ){
            System.out.println(e.getMessage());
        }
    }}

比如我現(xiàn)在需要百事可樂,我在af內(nèi)傳入百事可樂工廠:

我是可樂工廠下面的無糖可樂工廠
開始生產(chǎn)無糖可樂

如果傳入CocaColaFactory

我是可樂工廠下面的可口可樂工廠
開始生產(chǎn)可口可樂

感謝各位的閱讀,以上就是“Java工廠方法模式怎么實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java工廠方法模式怎么實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

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

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

AI