在設計模式中,簡單工廠方法模式 Simple Factory Pattern 是一個常見的設計模式,特別適合用來解決物件建立的問題。今天我們就來用一個大家耳熟能詳的特斯拉汽車工廠例子來解釋這個模式。
而工廠模式的核心思想是,將物件的建立過程封裝起來,客戶端只需要知道自己需要什麼,而不需要關心如何製作。
簡單工廠模式是非正式的設計模式,它比較是一個寫程式技巧,一般在講工廠模式通常指的是簡單工廠模式,在設計模式中,簡單工廠模式通常指的是建立者(工廠)沒有子類,而產品可以有子類。
具體來說,簡單工廠模式中工廠本身是一個靜態的方法或單一的類別,根據給定的參數來決定建立哪一種類型的物件。這個工廠類別通常不會有子類,因為它的目的就是統一處理產品的建立邏輯。然而工廠所產生的產品類別可以有不同的子類,以實現不同的具體產品。
例如有一個簡單工廠負責生產汽車,這個工廠可以根據需求產生不同類型的汽車(如電動車、油車)。在這個場景下,工廠本身不會有子類,但生產出來的產品(汽車)可能有多個子類,代表不同類型的汽車。
讓我們用特斯拉的汽車工廠來說明這個概念。這座汽車工廠能夠生產四種不同的車型:Model 3、Model Y、Model S 和 Model X。在這個例子裡我們將這四種車型視為不同的「產品類別」,而工廠則是負責建立這些車型物件的地方。
假設我們沒有使用工廠模式,每當需要建立一輛新的車,我們就必須自己手動選擇車型的類別並建立物件,像這樣寫,
std::unique_ptr<Car> myCar = std::make_unique<Model3>();
// 或傳統指標
Car* myCar = new Model3();
這種方式看起來簡單直接,但當我們的應用程式需要根據不同的條件來建立不同的車型時,程式碼就會變得很複雜,而且如果未來需要增加新的車型,我們就需要到每一處使用這段程式碼的地方進行修改,這非常容易出錯。
我們首先定義一個簡單的工廠類別 CarFactory
,這個類別有一個靜態方法 createCar
,根據傳入的車型名稱來建立對應的車型物件,
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;
}
}
};
使用工廠模式後,我們只需要簡單地告訴工廠我們需要什麼車型即可,
std::unique_ptr<Car> myCar = CarFactory::createCar("Model 3");
// 或傳統指標
Car* myCar = CarFactory::createCar("Model 3");
這樣一來,如果未來特斯拉推出了新的車型,例如 Model Z
,我們只需修改 CarFactory
類別,新增對 Model Z
的支援,而不需要去改動使用了 CarFactory
的所有地方。
簡單工廠模式的最大優點就是它的「簡單」。你只需要告訴工廠你想要什麼,它就能幫你生產出來。這讓程式碼變得更直觀,容易理解。所有的建立邏輯都集中在一個地方(工廠類別),如果我們要修改或新增新產品,只需要動這個工廠類別內的邏輯,其他地方的程式碼不受影響,也不需要去修改客戶端的程式碼,這樣即使需求變動,也可以輕鬆應對。
簡單工廠模式的缺點就是所有的建立邏輯都集中在工廠類別中,如果這個工廠要處理很多不同的產品類別,它會變得非常龐大和複雜,違反了「單一職責原則」。雖然新增新產品相對容易,但如果工廠需要產生的產品越來越多,工廠類別的邏輯也會越來越複雜,導致它變得難以維護和修改。簡單工廠適合處理簡單的物件建立需求,但如果每個產品的建立過程都很複雜,工廠就會變得難以維持。
工廠模式的核心思想是:把物件的建立過程封裝起來,使得客戶端(使用者)不需要關心具體物件是如何建立的,只需透過工廠來取得所需的物件。 這樣不僅減少了客戶端的複雜度,也增加了系統的靈活性,因為我們可以輕鬆地改變建立物件的方式,而不影響使用者的程式碼。
簡單工廠模式就像是一個自動化的汽車生產工廠,讓我們能夠方便地建立不同的物件。透過這個例子,我們能夠看到這種設計模式如何讓我們的程式碼變得更簡潔、更易於維護。就像特斯拉工廠能夠快速應對市場需求,生產出各式各樣的車型,我們的程式碼也能夠靈活地產生各種物件來應對不同的需求。
更多C++語言相關的文章,歡迎追蹤我的部落格
https://shengyu7697.github.io/cpp-simple-factory-pattern/