前言
在軟件設(shè)計(jì)中,常常會(huì)遇到需要根據(jù)不同情況選擇不同算法或行為的情況。策略模式和簡單工廠模式是兩種常見的設(shè)計(jì)模式,它們分別解決了對(duì)象行為的抽象和對(duì)象創(chuàng)建的抽象問題。在某些情況下,將這兩種模式結(jié)合起來可以更好地滿足實(shí)際需求,提高代碼的靈活性和可維護(hù)性。
策略模式與簡單工廠模式的結(jié)合:
策略模式用于定義一系列算法,將每個(gè)算法封裝到獨(dú)立的類中,并使它們可以相互替換,從而使得算法可以獨(dú)立于客戶端而變化。簡單工廠模式用于封裝對(duì)象的創(chuàng)建過程,將對(duì)象的創(chuàng)建與客戶端解耦。
將策略模式與簡單工廠模式結(jié)合起來,可以使得在創(chuàng)建具體策略對(duì)象時(shí)更加靈活,同時(shí)保持了策略對(duì)象的封裝性。通過簡單工廠模式,我們可以根據(jù)客戶端的需求動(dòng)態(tài)創(chuàng)建不同的具體策略對(duì)象,而策略模式則確保了這些對(duì)象可以被客戶端無縫地使用。
一、為什么需要策略模式+簡單工廠模式
當(dāng)我們面對(duì)需要根據(jù)不同情況選擇不同算法或行為的情況時(shí),策略模式是一個(gè)很好的選擇。它允許我們將不同的算法封裝成獨(dú)立的類,并且可以在運(yùn)行時(shí)靈活地切換這些算法,而不影響客戶端代碼。然而,單獨(dú)使用策略模式時(shí),我們需要在客戶端代碼中顯式地創(chuàng)建具體策略對(duì)象,這可能導(dǎo)致代碼變得復(fù)雜,尤其當(dāng)需要根據(jù)不同條件選擇不同的策略時(shí)。
這時(shí)候,簡單工廠模式可以派上用場。簡單工廠模式提供了一個(gè)統(tǒng)一的接口來創(chuàng)建對(duì)象,客戶端只需提供簡單的參數(shù),而不必了解具體對(duì)象的創(chuàng)建過程。將策略模式與簡單工廠模式結(jié)合起來,可以在需要時(shí)動(dòng)態(tài)地創(chuàng)建不同的具體策略對(duì)象,同時(shí)保持代碼的簡潔和可維護(hù)性。簡單工廠模式負(fù)責(zé)對(duì)象的創(chuàng)建,而策略模式確保了這些對(duì)象可以被靈活地使用,讓我們的軟件更加智能和適應(yīng)變化。這種結(jié)合使用的設(shè)計(jì)模式能夠提高代碼的靈活性、可擴(kuò)展性和可維護(hù)性,使得軟件系統(tǒng)更加健壯和易于理解。
二、策略模式+簡單工廠模式實(shí)現(xiàn)原理
- 策略模式:
首先定義一個(gè)策略接口(或抽象類),其中包含定義了一系列算法的方法。
創(chuàng)建具體的策略類,分別實(shí)現(xiàn)策略接口中的方法,每個(gè)具體策略類代表一個(gè)具體的算法。
在客戶端中,持有一個(gè)策略接口的指針(或引用),可以動(dòng)態(tài)切換不同的具體策略對(duì)象。
當(dāng)客戶端需要使用某個(gè)具體的算法時(shí),調(diào)用策略接口中定義的方法即可。
- 簡單工廠模式:
創(chuàng)建一個(gè)工廠類,負(fù)責(zé)根據(jù)傳入的參數(shù)來創(chuàng)建具體的對(duì)象。
工廠類中包含一個(gè)方法,根據(jù)不同的參數(shù)返回不同的具體對(duì)象實(shí)例。
- 結(jié)合實(shí)現(xiàn)原理:
在策略模式中,客戶端通常需要顯式地創(chuàng)建具體策略對(duì)象,這可能會(huì)導(dǎo)致代碼的復(fù)雜性。
為了解決這個(gè)問題,可以將具體策略對(duì)象的創(chuàng)建委托給簡單工廠,通過簡單工廠模式動(dòng)態(tài)地創(chuàng)建具體的策略對(duì)象。
這樣,客戶端只需要和簡單工廠打交道,向工廠傳遞參數(shù)即可獲取所需的具體策略對(duì)象,而無需直接創(chuàng)建對(duì)象。
當(dāng)需要在運(yùn)行時(shí)根據(jù)不同條件選擇不同的策略時(shí),可以通過簡單工廠來創(chuàng)建不同的策略對(duì)象,然后使用策略模式來執(zhí)行具體的算法。
三、UML圖
通過UML圖可以發(fā)現(xiàn)簡單工廠模式和策略模式+簡單工廠模式非常的像??!其主要差別就是工廠生成的類有一個(gè)統(tǒng)一執(zhí)行的函數(shù)execute
函數(shù)用來變成策略模式,進(jìn)而就有了策略模式的特征了
四、示例代碼
#include <iostream>
#include <memory>
// 抽象策略類
class Strategy {
public:
virtual void execute() const = 0;
virtual ~Strategy() {}
};
// 具體策略類 A
class ConcreteStrategyA : public Strategy {
public:
void execute() const override {
std::cout << "Executing strategy A\n";
}
};
// 具體策略類 B
class ConcreteStrategyB : public Strategy {
public:
void execute() const override {
std::cout << "Executing strategy B\n";
}
};
// 工廠類,用于創(chuàng)建具體策略對(duì)象
class StrategyFactory {
public:
static Strategy* createStrategy(char type) {
switch (type) {
case 'A':
return new ConcreteStrategyA;
case 'B':
return new ConcreteStrategyB;
default:
throw std::invalid_argument("Invalid strategy type");
}
}
};
int main() {
// 使用工廠類創(chuàng)建具體策略對(duì)象
auto strategyA = StrategyFactory::createStrategy('A');
auto strategyB = StrategyFactory::createStrategy('B');
// 執(zhí)行策略
strategyA->execute();
strategyB->execute();
return 0;
}
抽象策略類(Strategy):定義了執(zhí)行策略的接口 execute(),所有具體策略類都要實(shí)現(xiàn)這個(gè)接口。
具體策略類(ConcreteStrategyA 和 ConcreteStrategyB):實(shí)現(xiàn)了具體的策略,分別是策略 A 和策略 B。它們提供了不同的行為實(shí)現(xiàn)方式。
工廠類(StrategyFactory):用于創(chuàng)建具體策略對(duì)象。createStrategy 方法根據(jù)傳入的參數(shù)類型決定創(chuàng)建哪種具體策略對(duì)象。
主函數(shù)(main):在 main 函數(shù)中,通過工廠類創(chuàng)建了具體的策略對(duì)象 strategyA 和 strategyB,分別對(duì)應(yīng)策略 A 和策略 B。然后調(diào)用這些策略對(duì)象的 execute() 方法執(zhí)行相應(yīng)的策略。
實(shí)現(xiàn)決策的原理在于通過工廠類的 createStrategy 方法根據(jù)輸入的參數(shù)類型來動(dòng)態(tài)創(chuàng)建具體的策略對(duì)象。這種方式使得客戶端代碼與具體策略對(duì)象的創(chuàng)建過程解耦,同時(shí)利用了策略模式的靈活性,能夠在運(yùn)行時(shí)動(dòng)態(tài)地切換不同的策略。文章來源:http://www.zghlxwxcb.cn/news/detail-840624.html
總結(jié)
策略模式與簡單工廠模式的結(jié)合,能夠很好地將對(duì)象的行為和對(duì)象的創(chuàng)建分離,使得系統(tǒng)更具靈活性和可擴(kuò)展性。通過將具體策略對(duì)象的創(chuàng)建委托給簡單工廠,我們可以在不改變客戶端代碼的情況下動(dòng)態(tài)地切換不同的策略,從而更好地滿足不同的業(yè)務(wù)需求。這種結(jié)合使用的設(shè)計(jì)模式在實(shí)際項(xiàng)目中具有廣泛的應(yīng)用價(jià)值,可以幫助我們更好地組織和管理代碼結(jié)構(gòu),提高代碼的可維護(hù)性和可擴(kuò)展性。文章來源地址http://www.zghlxwxcb.cn/news/detail-840624.html
到了這里,關(guān)于【C++ 設(shè)計(jì)模式】策略模式與簡單工廠模式的結(jié)合的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!