朋友你好!今天我們繼續學習設計模式。在本課中,我們將討論工廠。我們將討論此模式解決的問題,並查看工廠如何幫助您開設咖啡店的示例。此外,我將為您提供創建工廠的 5 個簡單步驟。
為確保我們都在同一個波長上並且您將快速掌握這個概念,您應該熟悉以下主題:
步驟 2. 您

- 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
方法可以分為兩部分:
- 在語句中創建咖啡的特定實例
switch
。這就是工廠做它做的事情的地方——根據條件創建一個特定的類型。 - 準備——這是研磨、沖泡和倒入杯中。
- 準備過程本身所涉及的步驟(研磨、沖泡和倒入杯中)將保持不變(至少我們指望這一點)。
- 但是咖啡的種類可能會改變。也許我們會開始製作摩卡……Frappu……Mochacci……不管怎樣,一種新的咖啡。
switch
聲明進行更改。也有可能在我們的咖啡店中,這種orderCoffee
方法將不是我們製作不同類型咖啡的唯一場所。因此,必須在幾個地方進行更改。你可能已經明白我的意思了。我們需要重構。將負責製作咖啡的塊移到一個單獨的類中有兩個原因:
- 我們可以在其他地方重用煮咖啡的邏輯。
- 如果分類發生變化,我們將不必在創建咖啡的所有地方編輯代碼。只需在一個地方更改我們的代碼就足夠了。
建立我們的第一家工廠
為此,我們將創建一個新類,它只負責創建必要的咖啡類實例: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
。但是這樣我們就會失去兩個能力:
SimpleCoffeeFactory
繼承和覆蓋方法的能力createCoffee
。- 能夠將所需的工廠實現添加到我們的類中。
給咖啡店加工廠
讓我們使用工廠重寫咖啡店類: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. 您的程序有一個具有多個後代的類,如下圖所示:
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;
}
}
現在你可以像老闆一樣經營一家工廠。:)
GO TO FULL VERSION