溫州電子商務(wù)網(wǎng)站建設(shè)windows優(yōu)化大師有哪些功能
現(xiàn)實(shí)世界中的例子
????????考慮一個(gè)招聘經(jīng)理的情況。一個(gè)人不可能為每一個(gè)職位都進(jìn)行面試。根據(jù)職位空缺,她必須決定并將面試步驟委托給不同的人。
用簡(jiǎn)單的話來(lái)說(shuō)
????????它提供了一種將實(shí)例化邏輯委托給子類的方法。
維基百科的解釋
????????在基于類的編程中,工廠方法模式是一種創(chuàng)建型模式,它使用工廠方法來(lái)處理創(chuàng)建對(duì)象時(shí)無(wú)需指定將要?jiǎng)?chuàng)建對(duì)象的確切類的問(wèn)題。這是通過(guò)調(diào)用工廠方法(在接口中指定并由子類實(shí)現(xiàn),或者在基類中實(shí)現(xiàn)并由派生類可選地重寫)來(lái)創(chuàng)建對(duì)象,而不是直接調(diào)用構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)的。
編程示例:
????????以我們之前的招聘經(jīng)理為例,首先定義了一個(gè)Interviewer接口以及它的幾個(gè)實(shí)現(xiàn)類。
#include <iostream>
#include <memory>// 面試官接口
class Interviewer {
public:virtual void askQuestions() const = 0;virtual ~Interviewer() = default;
};// 開(kāi)發(fā)人員類
class Developer : public Interviewer {
public:void askQuestions() const override {std::cout << "詢問(wèn)關(guān)于設(shè)計(jì)模式的問(wèn)題!" << std::endl;}
};// 社區(qū)執(zhí)行官類
class CommunityExecutive : public Interviewer {
public:void askQuestions() const override {std::cout << "詢問(wèn)關(guān)于社區(qū)建設(shè)的問(wèn)題" << std::endl;}
};// 招聘經(jīng)理抽象類
class HiringManager {
public:virtual ~HiringManager() = default;virtual std::unique_ptr<Interviewer> makeInterviewer() const = 0;void takeInterview() const {auto interviewer = makeInterviewer();interviewer->askQuestions();}
};// 開(kāi)發(fā)經(jīng)理類
class DevelopmentManager : public HiringManager {
public:std::unique_ptr<Interviewer> makeInterviewer() const override {return std::make_unique<Developer>();}
};// 市場(chǎng)經(jīng)理類
class MarketingManager : public HiringManager {
public:std::unique_ptr<Interviewer> makeInterviewer() const override {return std::make_unique<CommunityExecutive>();}
};// 主函數(shù)演示功能
int main() {DevelopmentManager devManager;devManager.takeInterview(); // 輸出: 詢問(wèn)關(guān)于設(shè)計(jì)模式的問(wèn)題!MarketingManager marketingManager;marketingManager.takeInterview(); // 輸出: 詢問(wèn)關(guān)于社區(qū)建設(shè)的問(wèn)題。return 0;
}
Interviewer 接口
????????首先,我們有一個(gè) Interviewer 接口,所有的面試官類都必須實(shí)現(xiàn)這個(gè)接口。
class Interviewer {
public:virtual void askQuestions() const = 0; // 純虛函數(shù),子類必須實(shí)現(xiàn)virtual ~Interviewer() = default; // 虛析構(gòu)函數(shù),確保子類析構(gòu)函數(shù)被正確調(diào)用
};
Developer 類和 CommunityExecutive 類
????????這兩個(gè)類實(shí)現(xiàn)了 Interviewer 接口。
class Developer : public Interviewer {
public:void askQuestions() const override {std::cout << "詢問(wèn)關(guān)于設(shè)計(jì)模式的問(wèn)題!" << std::endl;}
};class CommunityExecutive : public Interviewer {
public:void askQuestions() const override {std::cout << "詢問(wèn)關(guān)于社區(qū)建設(shè)的問(wèn)題" << std::endl;}
};
HiringManager 抽象類
????????HiringManager 是一個(gè)抽象類,它包含了一個(gè)工廠方法 makeInterviewer,用于創(chuàng)建具體的面試官。它還包含一個(gè) takeInterview 方法,該方法使用工廠方法創(chuàng)建的面試官來(lái)進(jìn)行面試。
class HiringManager {
public:virtual ~HiringManager() = default; // 虛析構(gòu)函數(shù)// 工廠方法,子類必須實(shí)現(xiàn),用于創(chuàng)建面試官virtual std::unique_ptr<Interviewer> makeInterviewer() const = 0;// 進(jìn)行面試,使用工廠方法創(chuàng)建的面試官void takeInterview() const {auto interviewer = makeInterviewer();interviewer->askQuestions();}
};
具體的 HiringManager 子類
????????每個(gè)具體的招聘經(jīng)理類(如 DevelopmentManager 和 MarketingManager)實(shí)現(xiàn)了 HiringManager 類的工廠方法,以創(chuàng)建特定類型的面試官。
class DevelopmentManager : public HiringManager {
public:std::unique_ptr<Interviewer> makeInterviewer() const override {return std::make_unique<Developer>(); // 返回開(kāi)發(fā)人員面試官}
};class MarketingManager : public HiringManager {
public:std::unique_ptr<Interviewer> makeInterviewer() const override {return std::make_unique<CommunityExecutive>(); // 返回社區(qū)執(zhí)行官面試官}
};
主函數(shù)
????????在主函數(shù)中,我們創(chuàng)建了 DevelopmentManager 和 MarketingManager 的實(shí)例,并調(diào)用 takeInterview 方法,展示了不同的面試過(guò)程。
int main() {DevelopmentManager devManager;devManager.takeInterview(); // 輸出: 詢問(wèn)關(guān)于設(shè)計(jì)模式的問(wèn)題!MarketingManager marketingManager;marketingManager.takeInterview(); // 輸出: 詢問(wèn)關(guān)于社區(qū)建設(shè)的問(wèn)題。return 0;
}
類圖:
關(guān)系說(shuō)明
Interviewer 接口:
- Interviewer 是一個(gè)接口,定義了 askQuestions 方法。
- Developer 和 CommunityExecutive 類實(shí)現(xiàn)了 Interviewer 接口。
HiringManager 抽象類:
- HiringManager 是一個(gè)抽象類,定義了工廠方法 makeInterviewer 和一個(gè)模板方法 takeInterview。
- DevelopmentManager 和 MarketingManager 繼承了 HiringManager 并實(shí)現(xiàn)了 makeInterviewer 方法。
工廠方法模式:
- HiringManager 類的 makeInterviewer 方法是一個(gè)工廠方法,它的具體實(shí)現(xiàn)由子類 DevelopmentManager 和 MarketingManager 提供。
- DevelopmentManager 的 makeInterviewer 方法返回 Developer 對(duì)象。
- MarketingManager 的 makeInterviewer 方法返回 CommunityExecutive 對(duì)象。
何時(shí)使用:
????????當(dāng)類中包含一些通用處理邏輯,但所需的子類是在運(yùn)行時(shí)動(dòng)態(tài)決定的,或者換句話說(shuō),當(dāng)客戶端不知道它可能需要哪個(gè)具體的子類時(shí),這種模式非常有用。通過(guò)定義一個(gè)抽象類或接口以及一個(gè)或多個(gè)工廠方法,可以允許子類在運(yùn)行時(shí)決定實(shí)例化哪個(gè)類。這增加了代碼的靈活性和可擴(kuò)展性,因?yàn)樾碌淖宇惪梢栽诓恍薷默F(xiàn)有代碼的情況下被引入和使用。
????????在上面的例子中,HiringManager類提供了一個(gè)通用的takeInterview方法,但具體的面試官(Interviewer)是在子類中通過(guò)makeInterviewer工廠方法動(dòng)態(tài)決定的。這樣,當(dāng)需要添加新的面試官類型時(shí),只需創(chuàng)建一個(gè)新的實(shí)現(xiàn)Interviewer接口的類,并在相應(yīng)的招聘經(jīng)理子類中重寫makeInterviewer方法即可。