首頁 > 軟體

Java十分鐘精通進階簡單工廠模式

2022-03-22 19:01:12

1、什麼是工廠模式?

工廠模式的定義:

定義一個建立產品物件的工廠介面,將產品物件的實際建立工作推遲到具體子工廠類當中。這滿足建立型模式中所要求的「建立與使用相分離」的特點。

現實生活中,原始社會自給自足(沒有工廠),農耕社會小作坊(簡單工廠,民間酒坊),工業革命流水線(工廠方法,自產自銷),現代產業鏈代工廠(抽象工廠,富士康。我們可以看到工廠的變化趨勢,但是對於我們來說,看到是越簡單越好,也就是工廠更智慧化。

其實凡是需要生成複雜物件的地方,都可以嘗試考慮使用工廠模式來代替。

我們把被建立的物件稱為「產品」,把建立產品的物件稱為「工廠」。如果要建立的產品不多,只要一個工廠類就可以完成,這種模式叫「簡單工廠模式」。

簡單的說:

簡單工廠模式有一個具體的工廠類,可以生成多個不同的產品,屬於建立型設計模式

注意:

但是簡單工廠模式每增加一個產品就要增加一個具體產品類和一個對應的具體工廠類,這增加了系統的複雜度,違背了開閉原則。

簡單工廠模式的結構圖:

2、簡單工廠模式優點和缺點

優點:

  • 工廠類包含必要的邏輯判斷,可以決定在什麼時候建立哪一個產品的範例。使用者端可以免除直接建立產品物件的職責,很方便的建立出相應的產品。工廠和產品的職責區分明確
  • 使用者端無需知道所建立具體產品的類名,只需知道引數即可
  • 可以引入組態檔,在不修改使用者端程式碼的情況下更換和新增新的具體產品類

缺點:

  • 簡單工廠模式的工廠類單一,負責所有產品的建立,職責過重,一旦異常,整個系統將受影響。且工廠類程式碼會非常臃腫,違背高聚合原則
  • 使用簡單工廠模式會增加系統中類的個數(引入新的工廠類),增加系統的複雜度和理解難度
  • 系統擴充套件困難,一旦增加新產品不得不修改工廠邏輯,在產品型別較多時,可能造成邏輯過於複雜
  • 簡單工廠模式使用了 static 工廠方法,造成工廠角色無法形成基於繼承的等級結構

3、簡單工廠的程式碼實現

可樂工廠:

現在我們有一個可樂工廠,可以生產可樂:可口可樂、百事可樂、無糖可樂(目前暫定三種)

先定義一個可樂介面:

/**
 * 我們有一個可樂工廠
 */

public interface Cola {

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

定義可口可樂的方法,實現可樂介面,重寫方法:

/**
 * 可口可樂
 */

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("開始生產無糖可樂");
    }
}

OK,接著我們先按照之前普通的方法實現功能,也就是在模擬使用者端(測試類)中建立物件,使用方法的方式來實現:

/**
 *普通實現方法 
 */

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

        Cola c1 = new CocaCola();
        Cola c2 = new PepsiCola();
        Cola c3 = new SugarFreeCola();

        c1.cola();
        c2.cola();
        c3.cola();
    }
}

輸出:

開始生產可口可樂
開始生產百事可樂
開始生產無糖可樂

這樣是沒有問題的。但是這個方法相當於在測試類中實現了物件並使用了方法,雖然很好的完成了任務,但是,我們的三個實現類和和介面緊密的繫結到了一起,這意味著我們的程式碼耦合出現嚴重問題,不利於以後的維護。

方案: 我們可以在使用者端和具體實現方法之間新增一個簡單工廠:

/**
 *可樂工廠
 * 在這裡可以生產無糖可樂、百事可樂、可口可樂
 */

public class ColaFactory {

    //給每個產品定一個編號
    public static final int PepsiCola = 1; //百事
    public static final int CocaCola = 2;  //可口
    public static final int SugarFreeCola = 3; //無糖


    //通過編號來確定產品物件
    public static Cola getCola(int num){
        switch (num){
            case 1:
                return new PepsiCola();
            case 2:
                return new CocaCola();
            case 3:
                return new SugarFreeCola();
            default:
                return null;
        }
    }
}

測試類:

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

		//只要在這個方法捏傳入需要物件的引數,即可得到
        Cola c = ColaFactory.getCola(3); //引數按需傳入
        c.cola();

    }
}

當傳入3時:

開始生產無糖可樂

如果在後期需要新增產品,直接在工廠內新增選擇即可,通過方法和引數就可以獲取到

其他寫法:

我們可以不用預先設定產品的編號,也可以直接輸入產品名稱:

/**
 * 另一種工廠寫法
 */
public class ColaFactoryTest {

    public static Cola getCola(String name){
        if("無糖可樂".equals(name)){
            return new SugarFreeCola();
        }else if ("百事可樂".equals(name)){
            return new PepsiCola();
        }else if("可口可樂".equals(name)){
            return new CocaCola();
        }else {
            return null;
        }
    }
}

測試類:

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

        Cola c = ColaFactoryTest.getCola("百事可樂");
        c.cola();
        
    }
}

輸出:

開始生產百事可樂

這樣也是沒問題的,大家可以喜歡用自己喜歡的方式即可。

4、小結

簡單的工廠模式就是這樣,符合建立與使用相分離的特點,但是缺點也顯而易見,就是每次需要增加新產品的時候負責所有產品的建立,職責過重,一旦異常,整個系統將受影響。且工廠類程式碼會非常臃腫,違背高聚合原則,以及簡單工廠模式使用了 static 工廠方法,造成工廠角色無法形成基於繼承的等級結構等等。

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


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