CodeGym/Java Blog/Toto sisi/工廠設計模式
John Squirrels
等級 41
San Francisco

工廠設計模式

在 Toto sisi 群組發布
個成員
朋友你好!今天我們繼續學習設計模式。在本課中,我們將討論工廠。我們將討論此模式解決的問題,並查看工廠如何幫助您開設咖啡店的示例。此外,我將為您提供創建工廠的 5 個簡單步驟。 工廠設計模式 - 1 為確保我們都在同一個波長上並且您將快速掌握這個概念,您應該熟悉以下主題:
  • Java 中的繼承
  • 縮小和擴大 Java 中的引用類型
  • 不同類和對象之間的交互。

什麼是工廠?

工廠設計模式讓您可以控制對象的創建。創建新對象的過程並不簡單,但也不過分複雜。我們都知道我們需要new操作符來創建一個新的對象。也許這裡似乎沒有什麼可以控制的,但事實並非如此。假設我們的應用程序有一個具有許多後代的特定類。當需要根據特定條件創建特定類的實例時,可能會出現困難。工廠是一種設計模式,可幫助解決根據特定條件創建各種對象的問題。這對於一個抽象概念來說怎麼樣?當我們查看下面的示例時,這將變得更加清晰和具體。

讓我們準備各種類型的咖啡

假設我們想讓一家咖啡店自動化。我們需要教我們的程序如何製作不同類型的咖啡。為此,我們將創建一個咖啡類和一些衍生類來表示我們將準備的咖啡類型:美式咖啡、卡布奇諾咖啡、濃縮咖啡和拿鐵咖啡。讓我們從一般的咖啡課開始:
public class Coffee {
    public void grindCoffee(){
        // Grind the coffee
    }
    public void makeCoffee(){
        // Brew the coffee
    }
    public void pourIntoCup(){
        // Pour into a cup
    }
}
接下來,我們將創建它的子類:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
我們的客戶可以訂購任何類型的咖啡。他們的命令需要傳遞給程序。這可以通過多種方式完成,例如,使用String. 但是 anenum是最好的。我們將創建enum並定義與可以訂購的咖啡類型相對應的枚舉字段:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
偉大的。現在讓我們為我們的咖啡店編寫代碼:
public class CoffeeShop {

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
orderCoffee方法可以分為兩部分:
  1. 在語句中創建咖啡的特定實例switch。這就是工廠做它做的事情的地方——根據條件創建一個特定的類型。
  2. 準備——這是研磨、沖泡和倒入杯中。
如果您將來需要更改該方法,請務必了解以下內容:
  1. 準備過程本身所涉及的步驟(研磨、沖泡和倒入杯中)將保持不變(至少我們指望這一點)。
  2. 但是咖啡的種類可能會改變。也許我們會開始製作摩卡……Frappu……Mochacci……不管怎樣,一種新的咖啡。
我們已經相當有信心,將來我們將不得不對方法的switch聲明進行更改。也有可能在我們的咖啡店中,這種orderCoffee方法將不是我們製作不同類型咖啡的唯一場所。因此,必須在幾個地方進行更改。你可能已經明白我的意思了。我們需要重構。將負責製作咖啡的塊移到一個單獨的類中有兩個原因:
  1. 我們可以在其他地方重用煮咖啡的邏輯。
  2. 如果分類發生變化,我們將不必在創建咖啡的所有地方編輯代碼。只需在一個地方更改我們的代碼就足夠了。
也就是說,是時候建廠了。

建立我們的第一家工廠

為此,我們將創建一個新類,它只負責創建必要的咖啡類實例:
public class SimpleCoffeeFactory {
    public Coffee createCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        return coffee;
    }
}
恭喜!我們剛剛以最簡單的形式(幾乎)實現了工廠設計模式。如果我們將方法設為靜態,它可能會更簡單createCoffee。但是這樣我們就會失去兩個能力:
  1. SimpleCoffeeFactory繼承和覆蓋方法的能力createCoffee
  2. 能夠將所需的工廠實現添加到我們的類中。
順便說一句,說到實施……我們需要回到咖啡店並添加我們的咖啡機。

給咖啡店加工廠

讓我們使用工廠重寫咖啡店類:
public class CoffeeShop {

    private final SimpleCoffeeFactory coffeeFactory;

    public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
        this.coffeeFactory = coffeeFactory;
    }

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = coffeeFactory.createCoffee(type);
        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
出色的。現在我們將簡要描述工廠設計模式的一般結構。

開設自己的工廠的 5 個步驟

步驟 1. 您的程序有一個具有多個後代的類,如下圖所示: 工廠設計模式 - 2步驟 2. 您enum為每個子類創建一個帶有字段的類:
enum CatType {
    LION,
    TIGER,
    FLUFFY
}
第 3 步。建立你的工廠。打電話吧CatFactory。這是代碼:
class CatFactory {}
第 4 步。在您的工廠中,創建一個createCat帶有CatType參數的方法。這是代碼:
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
第 5 步。在方法的主體中,編寫switch枚舉枚舉字段並創建與傳遞的值對應的類的實例的語句enum
class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;

            switch (type) {
                case LION:
                    cat =  new Fluffy();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case FLUFFY:
                    cat =  new Lion();
                    break;
            }

            return cat;
        }
    }
現在你可以像老闆一樣經營一家工廠。:)

如何練習

看書好,寫代碼更棒。如果您的名字有偶數個字母,請嘗試創建您自己的虛擬比薩店。如果您的名字有奇數個字母,請嘗試創建一個虛擬壽司吧。如果你沒有名字,那你就走運了。今天你可以放鬆一下。
留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言