C++中策略模式和工廠模式的區(qū)別
工廠模式和策略模式看著很像,經(jīng)常讓人混淆不清;
它們的區(qū)別在哪里,需要細(xì)細(xì)體味;
相似點(diǎn)
在模式結(jié)構(gòu)上,兩者很相似;
差異
- 用途不一樣
工廠是創(chuàng)建型模式,它的作用就是創(chuàng)建對(duì)象;
策略是行為型模式,它的作用是讓一個(gè)對(duì)象在許多行為中選擇一種行為;
關(guān)注點(diǎn)不一樣
一個(gè)關(guān)注對(duì)象創(chuàng)建
一個(gè)關(guān)注行為的封裝解決不同的問題
工廠模式是創(chuàng)建型的設(shè)計(jì)模式,它接受指令,創(chuàng)建出符合要求的實(shí)例;它主要解決的是資源的統(tǒng)一分發(fā),將對(duì)象的創(chuàng)建完全獨(dú)立出來,讓對(duì)象的創(chuàng)建和具體的使用客戶無關(guān)。主要應(yīng)用在多數(shù)據(jù)庫選擇,類庫文件加載等。
策略模式是為了解決的是策略的切換與擴(kuò)展,更簡(jiǎn)潔的說是定義策略族,分別封裝起來,讓他們之間可以相互替換,策略模式讓策略的變化獨(dú)立于使用策略的客戶。工廠相當(dāng)于黑盒子,策略相當(dāng)于白盒子;
舉例說明
工廠模式
有一天你決定去吃培根披薩,首先得選擇店鋪,A店和B店都有培根披薩;
你點(diǎn)了A店的培根披薩,過了二十分鐘,你的披薩就來了就可以吃到了。但這個(gè)披薩是怎么做的,到底面粉放了多少,培根放了多少,佐料放了多少,有多少道工序,你是不需要管的,你需要的是一個(gè)美味培根披薩。策略模式
在披薩店,你要一個(gè)培根披薩,老板說有標(biāo)準(zhǔn)的pizza,也可以自己去做。原料有培根、面粉、佐料。工序有1、2、3工序,你自己去做吧。然后你就需要自己去做,到底放多少培根,放多少面粉,放多少佐料,這都你自己來決定,工序1、2、3,你是怎么實(shí)現(xiàn)的,都你自己決定。最后你得到了披薩。
代碼實(shí)現(xiàn)
我們用代碼來實(shí)現(xiàn)上面的不同點(diǎn):
工廠模式

class Store
{
void orderPizza(){
Pizza *p = createPizza()
//有了pizza對(duì)象后,接下來的工序都是一樣的,對(duì)用戶而言,是透明的;
p->prepare(); //準(zhǔn)備材料,放調(diào)料
p->bak(); //烘烤
p->cut(); //切塊
}
virtual createPizza() = 0;
}
class AStore : public Store
{
virtual Pizza * createPizza()
{
Pizza * p = new APizza();
return p;
}
}策略模式

class Store
{
void orderPizza(){
Pizza *p = MyPizza();
//工序都有,但是具體如何實(shí)現(xiàn),由用戶來確定實(shí)現(xiàn);
p->prepare();
p->bak();
p->cut();
}
class MyPizza : public Pizza
{
virtual void prepare(){
//我的pizza我做主,我可以多放點(diǎn)肉,再多來點(diǎn)醬
}
virtual void bak(){
//我想烤的時(shí)間長(zhǎng)點(diǎn),這樣會(huì)更脆
}
virtual void cut(){
//切塊,我想切成20塊,像吃西瓜片那樣吃披薩
}
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++11中std::function基礎(chǔ)用法詳解
std::function是C++11標(biāo)準(zhǔn)庫中提供的一種可調(diào)用對(duì)象的通用類型,它可以存儲(chǔ)任意可調(diào)用對(duì)象,本文就來和大家講講它的基礎(chǔ)用法,希望對(duì)大家有所幫助2023-04-04
C++求所有頂點(diǎn)之間的最短路徑(用Floyd算法)
這篇文章主要為大家詳細(xì)介紹了C++求所有頂點(diǎn)之間的最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C語言對(duì)CSV文件從最后往前一行一行讀取的實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于C語言對(duì)CSV文件從最后往前一行一行讀取的實(shí)現(xiàn)方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
STL priority_queue(優(yōu)先隊(duì)列)詳解
這篇文章主要介紹了 STL priority_queue(優(yōu)先隊(duì)列)詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10
盤點(diǎn)分析C語言中少見卻強(qiáng)大的字符串函數(shù)
這篇文章主要為大家盤點(diǎn)及分析C語言中少見卻強(qiáng)大的字符串函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02
C++實(shí)現(xiàn)無重復(fù)字符的最長(zhǎng)子串
本文主要介紹了C++實(shí)現(xiàn)無重復(fù)字符的最長(zhǎng)子串,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
C++類與對(duì)象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解
這篇文章主要為大家介紹了C++類與對(duì)象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

