C++ 設計模式 - 簡單工廠模式 Simple Factory Pattern

在設計模式中,簡單工廠方法模式 Simple Factory Pattern 是一個常見的設計模式,特別適合用來解決物件建立的問題。今天我們就來用一個大家耳熟能詳的特斯拉汽車工廠例子來解釋這個模式。

而工廠模式的核心思想是,將物件的建立過程封裝起來,客戶端只需要知道自己需要什麼,而不需要關心如何製作。

什麼是簡單工廠模式?

簡單工廠模式是非正式的設計模式,它比較是一個寫程式技巧,一般在講工廠模式通常指的是簡單工廠模式,在設計模式中,簡單工廠模式通常指的是建立者(工廠)沒有子類,而產品可以有子類。

具體來說,簡單工廠模式中工廠本身是一個靜態的方法或單一的類別,根據給定的參數來決定建立哪一種類型的物件。這個工廠類別通常不會有子類,因為它的目的就是統一處理產品的建立邏輯。然而工廠所產生的產品類別可以有不同的子類,以實現不同的具體產品。

例如有一個簡單工廠負責生產汽車,這個工廠可以根據需求產生不同類型的汽車(如電動車、油車)。在這個場景下,工廠本身不會有子類,但生產出來的產品(汽車)可能有多個子類,代表不同類型的汽車。

簡單工廠模式在特斯拉汽車工廠的應用

讓我們用特斯拉的汽車工廠來說明這個概念。這座汽車工廠能夠生產四種不同的車型:Model 3、Model Y、Model S 和 Model X。在這個例子裡我們將這四種車型視為不同的「產品類別」,而工廠則是負責建立這些車型物件的地方。

假設我們沒有使用工廠模式,每當需要建立一輛新的車,我們就必須自己手動選擇車型的類別並建立物件,像這樣寫,

1
2
3
std::unique_ptr<Car> myCar = std::make_unique<Model3>();
// 或傳統指標
Car* myCar = new Model3();

這種方式看起來簡單直接,但當我們的應用程式需要根據不同的條件來建立不同的車型時,程式碼就會變得很複雜,而且如果未來需要增加新的車型,我們就需要到每一處使用這段程式碼的地方進行修改,這非常容易出錯。

我們首先定義一個簡單的工廠類別 CarFactory,這個類別有一個靜態方法 createCar,根據傳入的車型名稱來建立對應的車型物件,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CarFactory {
public:
static std::unique_ptr<Car> createCar(const std::string& carType) {
if (carType == "Model 3") {
return std::make_unique<Model3>();
} else if (carType == "Model S") {
return std::make_unique<ModelS>();
} else if (carType == "Model X") {
return std::make_unique<ModelX>();
} else if (carType == "Model Y") {
return std::make_unique<ModelY>();
} else {
return nullptr;
}
}
};

使用工廠模式後,我們只需要簡單地告訴工廠我們需要什麼車型即可,

1
2
3
std::unique_ptr<Car> myCar = CarFactory::createCar("Model 3");
// 或傳統指標
Car* myCar = CarFactory::createCar("Model 3");

這樣一來,如果未來特斯拉推出了新的車型,例如 Model Z,我們只需修改 CarFactory 類別,新增對 Model Z 的支援,而不需要去改動使用了 CarFactory 的所有地方。

簡單工廠方法模式的優缺點

簡單工廠模式的最大優點就是它的「簡單」。你只需要告訴工廠你想要什麼,它就能幫你生產出來。這讓程式碼變得更直觀,容易理解。所有的建立邏輯都集中在一個地方(工廠類別),如果我們要修改或新增新產品,只需要動這個工廠類別內的邏輯,其他地方的程式碼不受影響,也不需要去修改客戶端的程式碼,這樣即使需求變動,也可以輕鬆應對。

簡單工廠模式的缺點就是所有的建立邏輯都集中在工廠類別中,如果這個工廠要處理很多不同的產品類別,它會變得非常龐大和複雜,違反了「單一職責原則」。雖然新增新產品相對容易,但如果工廠需要產生的產品越來越多,工廠類別的邏輯也會越來越複雜,導致它變得難以維護和修改。簡單工廠適合處理簡單的物件建立需求,但如果每個產品的建立過程都很複雜,工廠就會變得難以維持。

簡單工廠模式跟工廠方法模式的差別

簡單工廠模式和工廠方法模式是兩種不同的設計模式,各自有不同的用途和適用場景,但它們確實有一定的關聯性。

簡單工廠模式(Simple Factory Pattern)並不被視為一個正式的設計模式,更像是一個寫程式技巧。它集中了一個工廠類來生產產品,通常使用一個靜態方法根據參數決定要建立的物件。這樣做的好處是簡單易用,但缺點在於違反了「開放封閉原則」,也就是如果需要擴展產品類型,就必須修改工廠的程式碼。

工廠方法模式(Factory Method Pattern)是一個正式的設計模式,屬於建立型設計模式之一。它的核心思想是將建立物件的過程延遲到子類別,透過定義一個工廠接口,讓子類別決定具體要實例化的產品類型。這樣,工廠方法模式解決了簡單工廠的缺點,符合「開放封閉原則」,因為新增產品類型時不需要修改已有的程式碼,只需擴展子類別即可。

可以說簡單工廠模式是工廠方法模式的簡化,而工廠方法模式是簡單工廠模式的改良版,更靈活但也更複雜。工廠方法模式讓系統更具擴展性,特別是在需要經常擴展產品種類的場景中更有優勢。

在實際開發中,選擇哪種模式取決於項目的複雜度和未來的擴展需求。如果產品類型較少且變化不大,簡單工廠模式是一個快速且簡單的選擇;如果產品類型多且經常變化,工廠方法模式則能提供更好的擴展性和可維護性。

總結

工廠模式的核心思想是:把物件的建立過程封裝起來,使得客戶端(使用者)不需要關心具體物件是如何建立的,只需透過工廠來取得所需的物件。這樣不僅減少了客戶端的複雜度,也增加了系統的靈活性,因為我們可以輕鬆地改變建立物件的方式,而不影響使用者的程式碼。

簡單工廠模式就像是一個自動化的汽車生產工廠,讓我們能夠方便地建立不同的物件。透過這個例子,我們能夠看到這種設計模式如何讓我們的程式碼變得更簡潔、更易於維護。就像特斯拉工廠能夠快速應對市場需求,生產出各式各樣的車型,我們的程式碼也能夠靈活地產生各種物件來應對不同的需求。

其它相關文章推薦
如果你想學習設計模式相關技術,可以參考看看下面的文章,
工廠方法模式 Factory Method Pattern
抽象工廠模式 Abstract Factory Pattern