朋友你好!今天我們繼續和大家一起學習設計模式。在本次講座中,我們將討論工廠。我們將與您討論使用此範本解決了哪些問題,並查看工廠如何幫助開設咖啡店的範例。我還將為您提供創建工廠的 5 個簡單步驟。 為了與大家達成一致並輕鬆掌握本質,您應該熟悉以下主題:
- 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
可分為兩個部分:
- 在區塊中建立特定的咖啡實例
switch-case
。工廠所做的就是根據條件創建特定類型。 - 準備工作本身就是研磨、烹飪並倒入杯中。
- 準備演算法本身(研磨、烹飪和倒入杯子)將保持不變(至少我們希望如此)。
- 但咖啡的範圍可能會改變。也許我們會開始製作摩卡..摩卡..摩卡奇...上帝保佑他,一種新型咖啡。
switch-case
。也有可能在我們的咖啡店裡,這種方法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("Вот ваш кофе! Спасибо, приходите еще!");
return coffee;
}
}
偉大的。現在讓我們試著示意性地、簡潔地描述一下工廠設計模式的結構。
開設自己的工廠的 5 個步驟
步驟 1. 在您的程式中,您有一個具有多個後代的類,如下圖所示: 步驟 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;
}
}
像一個老闆一樣。
GO TO FULL VERSION