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