首頁 > 軟體

Java十分鐘精通進階工廠方法模式

2022-03-22 19:01:05

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

工廠方法模式:也叫虛擬構造器模式或者多型工廠模式,它屬於類建立型模式。

在工廠方法模式中,工廠父類別負責定義建立產品物件的公共介面,而工廠子類則負責生成具體的產品物件,這樣做的目的是將產品類的範例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該範例化哪一個具體產品類。

我們知道在現在的真實工廠內分工越來越細,越來越專業化。。各種產品有專門的工廠生產,徹底告別了自給自足的小農經濟時代,這大大縮短了產品的生產週期,提高了生產效率。而工廠方法模式即滿足了開閉原則,也繼承了簡單工廠模式的優點。

舉例說明:

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

二、工廠方法模式的優缺點

優點:

  • 使用者只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體建立過程
  • 靈活性增強,對於新產品的建立,只需多寫一個相應的工廠類
  • 典型的解耦框架。高層模組只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則

缺點:

  • 類的個數容易過多,增加複雜度
  • 增加了系統的抽象性和理解難度
  • 抽象產品只能生產一種產品,此弊端可使用抽象工廠模式解決(抽象工廠模式在下一篇文章)

三、模式的結構與實現

結構由以下四個部分組成:

  • 抽象工廠(Abstract Factory):提供了建立產品的介面,呼叫者通過它存取具體工廠的工廠方法 newProduct() 來建立產品
  • 具體工廠(ConcreteFactory):主要是實現抽象工廠中的抽象方法,完成具體產品的建立
  • 抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能
  • 具體產品(ConcreteProduct):實現了抽象產品角色所定義的介面,由具體工廠來建立,它同具體工廠之間一一對應

結構圖:

四、工廠方法模式程式碼實現

還是以上一篇文章的可樂工廠為例:

產品有:可口可樂、百事可樂、無糖可樂

在簡單工廠模式中只有一個可樂工廠,可以生產三種產品,在工廠方法模式中就可以有多個工廠來生成對應的產品:

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

生產可樂的方法:

/**
 *  提供了產品的介面
 */

public interface Cola {

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

可樂抽象工廠:

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

public interface ColaFactory {

    public Cola newCola();
}

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

/**
 * 產品名稱:可樂可樂,實現了產品的介面
 */

public class CocaCola implements Cola{

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

百事可樂:

/**
 *
 * 產品名稱:百事可樂,實現了產品的介面
 */

public class PepsiCola implements Cola{

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

無糖可樂:

/*
 * 產品名稱:無糖可樂,實現了產品的介面
 */

public class SugarFreeCola implements Cola{

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

三個產品對應三個工廠:

生產可口可樂的工廠:

/**
 *
 * 具體工廠1:可口可樂工廠
 */

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

生產百事可樂的工廠:

/**
 *
 * 具體工廠2:百事可樂工廠
 */

public class PepsiColaFactory implements ColaFactory{

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

生產無糖可樂的工廠:

/*
 * 具體工廠3:無糖可樂工廠
 */

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

到這裡目前有:

  • 一生產可樂的方法
  • 一個可樂工廠(下面有多個小工廠)
  • 三個生產三種型別可樂的方法(實現可樂介面)
  • 三個可樂工廠(生產三種可樂,實現可樂工廠介面)

測試類:

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

        try{

            //新建一個可樂方法物件
            Cola a;

            //新建一個可樂工廠物件
            ColaFactory af;

            //告訴可樂工廠,你需要什麼可樂,並且通知對應的分工廠
            af = (ColaFactory) new PepsiColaFactory();
            //執行對於生產方法
            a = af.newCola();
            a.cola();
            
        }catch (Exception e ){
            System.out.println(e.getMessage());
        }
    }
}

比如我現在需要百事可樂,我在af內傳入百事可樂工廠:

我是可樂工廠下面的無糖可樂工廠
開始生產無糖可樂

如果傳入CocaColaFactory:

我是可樂工廠下面的可口可樂工廠
開始生產可口可樂

五、總結

這就是工廠方法模式,和簡單工廠模式有所不同,在這個模式內有一個抽象工廠介面,也就是你需要增加新產品後,不需要在原本的工廠內去修改程式碼,而是直接新建一個工廠,去實現抽象工廠即可,也是符合了開閉原則。

當然缺點也就是工廠多了,管理變得複雜,也增加了系統的抽象性和理解難度,而且抽象產品只能生產一種產品,但是此弊端可使用抽象工廠模式解決(抽象工廠模式在下一篇文章)

到此這篇關於Java十分鐘精通進階工廠方法模式的文章就介紹到這了,更多相關Java 工廠方法模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com