JavaRush /Java Blog /Random-TW /工廠設計模式

工廠設計模式

在 Random-TW 群組發布
朋友你好!今天我們繼續和大家一起學習設計模式。在本次講座中,我們將討論工廠。我們將與您討論使用此範本解決了哪些問題,並查看工廠如何幫助開設咖啡店的範例。我還將為您提供創建工廠的 5 個簡單步驟。 工廠設計模式 - 1為了與大家達成一致並輕鬆掌握本質,您應該熟悉以下主題:
  • Java中的繼承
  • Java 中引用類型的縮小與擴展
  • 不同類別和物件之間的交互

什麼是工廠?

工廠設計模式可讓您控制物件的建立。創建新物件的過程並不那麼簡單,但也不是太複雜。我們都知道,要建立一個新對象,我們必須使用new. 看起來這裡沒有什麼可管理的,但事實並非如此。當我們的應用程式具有某個具有許多後代的類,並且需要根據某些條件建立某個類別的實例時,可能會出現困難。 工廠是一種設計模式,有助於解決根據某些條件創建不同物件的問題。抽象的,不是嗎?當我們看下面的例子時,會顯得更加具體和清晰。

我們創造不同類型的咖啡

假設我們想要實現一家咖啡店的自動化。我們需要學習如何準備不同類型的咖啡。為此,在我們的應用程式中,我們將創建一個咖啡類及其衍生品:美式咖啡、卡布奇諾、濃縮咖啡、拿鐵 - 我們將準備的咖啡類型。我們先從一般的咖啡類開始:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
接下來,讓我們創建它的繼承人:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
我們的客戶將訂購某種類型的咖啡,並且需要將此資訊傳遞給程式。這可以透過不同的方式完成,例如使用String. 但它最適合這些目的enum。讓我們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("Вот ваш кофе! Спасибо, приходите еще!");
        return coffee;
    }
}
此方法orderCoffee可分為兩個部分:
  1. 在區塊中建立特定的咖啡實例switch-case。工廠所做的就是根據條件創建特定類型。
  2. 準備工作本身就是研磨、烹飪並倒入杯中。
如果您將來需要更改該方法,需要了解以下重要資訊:
  1. 準備演算法本身(研磨、烹飪和倒入杯子)將保持不變(至少我們希望如此)。
  2. 但咖啡的範圍可能會改變。也許我們會開始製作摩卡..摩卡..摩卡奇...上帝保佑他,一種新型咖啡。
我們已經可以假設,在未來,以一定的機率,我們將不得不對方法、區塊進行更改switch-case。也有可能在我們的咖啡店裡,這種方法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("Вот ваш кофе! Спасибо, приходите еще!");
        return coffee;
    }
}
偉大的。現在讓我們試著示意性地、簡潔地描述一下工廠設計模式的結構。

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

步驟 1. 在您的程式中,您有一個具有多個後代的類,如下圖所示: 工廠設計模式 - 2步驟 2. 建立一個類enum,在其中為每個後代類定義一個枚舉變數:
enum CatType {
    LION,
    TIGER,
    BARSIK
}
第 3 步:建造工廠。你調用它MyClassFactory,程式碼如下:
class CatFactory {}
步驟 4. 在工廠中建立一個createMyClass採用變數 - 的方法enum MyClassType。程式碼如下:
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
步驟 5. 在方法主體中編寫一個區塊,switch-case在該區塊中迭代所有枚舉值並建立與該enum值對應的類別的實例:
class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;

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

            return cat;
        }
    }
像一個老闆一樣。

如何訓練

讀書很好,寫程式更棒。如果您的名字有偶數個字母,請嘗試建立自己的虛擬比薩店。如果您的名字有奇數個字母,請嘗試建立一個虛擬壽司吧。如果您是匿名的,那麼您很幸運。今天你可以休息了。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION