5分鐘學(xué)設(shè)計模式:簡單工廠與美食街的不期而遇
大家好,我是知微。
寫代碼好幾年,是不是還糾結(jié)于這些問題:
- 面對一堆
if-else,代碼越寫越長,維護(hù)起來比攀登珠穆朗瑪峰還難 - 每次只敢小心翼翼改個小功能,生怕程序突然“嘭”一聲,全炸了
- 想學(xué)習(xí)大佬們的代碼,卻總是看得一頭霧水,不知如何下手。
別急,優(yōu)秀的代碼設(shè)計往往有秘訣——設(shè)計模式。模仿只是表面,理解背后的設(shè)計哲學(xué)才是關(guān)鍵。
設(shè)計模式,何方神圣?

在編程的江湖里,設(shè)計模式就是解決問題的寶典,是前輩們在軟件開發(fā)中留下的寶貴經(jīng)驗,幫我們寫出可復(fù)用、靈活、高效的代碼。
設(shè)計模式,三分天下
設(shè)計模式大致分為三類:
- 創(chuàng)建型模式:關(guān)注對象的誕生,如何優(yōu)雅地創(chuàng)建和管理對象。
- 結(jié)構(gòu)型模式:關(guān)注類和對象的“排列組合”,化簡為繁,構(gòu)建復(fù)雜系統(tǒng)。
- 行為型模式:關(guān)注對象之間的“互動”,定義它們?nèi)绾螀f(xié)同工作。

“唉,又來這些概念,頭都大了!”
行了行了,不賣關(guān)子了,咱們直接進(jìn)入正題:簡單工廠模式。
第一幕:美食街的邂逅
晚上11點,你終于結(jié)束了一天的工作,疲憊地走在回家的路上。經(jīng)過一條熱鬧的美食街,空氣中彌漫著各種美食的香味,讓你不由自主地停下了腳步。
你心想:“萬事皆空,唯美食不可辜負(fù),今天一定要好好犒勞自己!”但打開微信錢包一看,發(fā)現(xiàn)余額只剩下5塊。你嘆了口氣,只能找個小吃攤隨便吃點。

你走向最近的一個攤位,對老板說:“老板,來份煎餅果子!”
老板熱情地回應(yīng):“好嘞,加不加雞蛋?”
你擺了擺手,老板見狀,便開始熟練地制作起來。

用代碼表示
class Pancake {
public:
void serve() {
std::cout << "你的煎餅果子好了!" << std::endl;
}
};
int main() {
Pancake p;
p.serve(); // 顧客:老板,來份煎餅果子!
return 0;
}
第二幕:美食街的新品
幾周后,你再次來到美食街,老板熱情地向你推薦:“我們最近新增了雞蛋灌餅,要不要嘗嘗?”你心想,既然來了,不妨試試新口味。
你對老板說:“老板,那就來份雞蛋灌餅吧!”
老板手腳麻利,很快為你準(zhǔn)備好了熱騰騰的雞蛋灌餅。
用代碼表示
// ...之前的煎餅果子的代碼
class EggPancake {
public:
void serve() {
std::cout << "熱騰騰的雞蛋灌餅好了!" << std::endl;
}
};
int main() {
// ...之前的煎餅果子的代碼
EggPancake ep;
ep.serve(); // 顧客:老板,來份雞蛋灌餅吧!
return 0;
}
第三幕:美食街的繁榮
隨著時間的流逝,美食街越來越繁榮,小吃攤也增加了更多的小吃品種,如手抓餅和肉夾饃。每次光顧,你都能嘗試不同的美食。
用代碼表示
// ...之前的煎餅果子和雞蛋灌餅的代碼
class HandPies {
public:
void serve() {
std::cout << "香脆的手抓餅好了!" << std::endl;
}
};
class RouJiaMo {
public:
void serve() {
std::cout << "美味的肉夾饃好了!" << std::endl;
}
};
int main() {
// ...之前的煎餅果子和雞蛋灌餅的代碼
HandPies hp;
hp.serve(); // 顧客:老板,來份手抓餅!
RouJiaMo rjm;
rjm.serve(); // 顧客:老板,來個肉夾饃!
return 0;
}
第四幕:簡單工廠的引入
你注意到,隨著小吃種類的增加,老板開始使用一張菜單,上面列出了所有可以提供的小吃。每次你只需要告訴老板你想要什么,老板就會從菜單上找到對應(yīng)的小吃,然后為你準(zhǔn)備。

你突然靈光一閃,這不正是編程中的簡單工廠模式嗎?通過一個統(tǒng)一的接口來創(chuàng)建不同的對象。
引入簡單工廠模式
#include <memory>
#include <string>
#include <iostream>
class Snack {
public:
virtual void serve() = 0;
virtual ~Snack() {}
};
class Pancake : public Snack {
public:
void serve() override {
std::cout << "你的煎餅果子好了!" << std::endl;
}
};
class EggPancake : public Snack {
public:
void serve() override {
std::cout << "熱騰騰的雞蛋灌餅好了!" << std::endl;
}
};
// ...其他小吃類
class SnackFactory {
public:
static std::unique_ptr<Snack> createSnack(const std::string& type) {
if (type == "PANCAKE") {
return std::make_unique<Pancake>();
}
// ...根據(jù)類型創(chuàng)建其他小吃
return nullptr;
}
};
int main() {
auto snack = SnackFactory::createSnack("PANCAKE");
snack->serve(); // 顧客:老板,來份煎餅果子!
// ...根據(jù)顧客的選擇,創(chuàng)建其他小吃
return 0;
}
采用簡單工廠模式,美食街的老板就能輕松滿足顧客的各種小吃需求,顧客點餐也變得更快捷。
這個模式的妙處在于,它把創(chuàng)建小吃對象的過程從原來的地方挪到了一個專門的“工廠”里。一開始,你可能覺得這個改變沒啥大不了的,特別是當(dāng)你的程序還很簡單,只有幾個類的時候。但是,隨著你的程序越來越龐大和復(fù)雜,這個模式的好處就會慢慢顯現(xiàn)出來。
- 簡化代碼:你不用再代碼的各個角落重復(fù)寫創(chuàng)建對象的代碼了。
- 易于管理:所有的創(chuàng)建邏輯都集中在工廠類里,改起來簡單多了。
- 擴展方便:想加個新小吃?在工廠類里添幾行代碼就行,不用滿世界找代碼改。
- 減少依賴:你的代碼塊之間互相依賴少了,更像是獨立的模塊。
值得注意的是,盡管簡單工廠模式?jīng)]有被列入GoF的23種經(jīng)典設(shè)計模式,但它在軟件開發(fā)實踐中仍然非常有用,特別是對于新手來說,它是學(xué)習(xí)面向?qū)ο笤O(shè)計原則和設(shè)計模式的一個很好的起點。
以上就是簡單工廠模式的全部內(nèi)容了,后面我會接著介紹GoF的23種經(jīng)典設(shè)計模式,敬請期待!
??你的每一次??點贊 ?收藏 ??評論,都是我更新的動力,如有錯誤請留言指正,非常感謝!

浙公網(wǎng)安備 33010602011771號