簡單工廠與策略模式

2022-08-05 08:24:13 字數 3982 閱讀 1329

專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。它又稱為靜態工廠方法模式,屬於類的建立型模式。簡單工廠模式的實質是由乙個工廠類根據傳入的引數,動態決定應該建立哪乙個產品類(這些產品類繼承自乙個父類或介面)的例項。

該模式中包含的角色及其職責:

1、工廠(creator)角色

簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類可以被外界直接呼叫,建立所需的產品物件。

2、抽象(product)角色

簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。

3、具體產品(concrete product)角色

簡單工廠模式的特點:

簡單工廠模式的建立目標,所有建立的物件都是充當這個角色的某個具體類的例項。不難發現,簡單工廠模式的缺點也正體現在其工廠類上,由於工廠類集中了所有例項的建立邏輯,所以「高內聚」方面做的並不好。另外,當系統中的具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴充套件性並不很好。

定義一系列的演算法,把他們乙個個封裝起來,並且使它們可以相互替換。策略模式讓演算法可以獨立於使用它的客戶而變化。

適用性:

1、許多相關的類僅僅是行為有異。「策略」提供了一種用多個行為中的乙個行為來配置乙個類的方法。

2、需要使用乙個演算法的不同變體。例如:你可能會定義一些反應不同的空間、時間權衡的演算法。當這些變體為乙個演算法的類層次時,可以用本模式。

3、演算法使用客戶不應該知道的資料。可適用策略模式避免暴露複雜、與演算法相關的資料結構。

4、乙個類定義了多種行為,並且這些行為在這個類的操作中以多個條件語句的形式出現。

參與者:

1、strategy策略

定義所以支援的演算法的公共介面。

2、concretestrategy具體策略

以strategy介面實現的具體演算法。

3、context

a.用乙個concretestrategy物件來配置。

b.維護乙個strategy物件的引用。

c.可定義乙個介面來讓strategy訪問它的資料。

1、用途不一樣 

工廠是建立型模式,它的作用就是建立物件; 

策略是行為型模式,它的作用是讓乙個物件在許多行為中選擇一種行為;

2、關注點不一樣 

乙個關注物件建立 

乙個關注行為的封裝

3、解決不同的問題 

工廠模式是建立型的設計模式,它接受指令,建立出符合要求的例項;它主要解決的是資源的統一分發,將物件的建立完全獨立出來,讓物件的建立和具體的使用客戶無關。主要應用在多資料庫選擇,類庫檔案載入等。 

策略模式是將不同的演算法封裝成乙個物件,這些不同的演算法從乙個抽象類或者乙個介面中派生出來,客戶端持有乙個抽象的策略的引用,這樣客戶端就能動態的切換不同的策略。策略模式讓策略的變化獨立於使用策略的客戶。

**:用簡單方法實現兩個數基本的算術運算!

定義乙個基類

class

operation

virtual

void setnum1(double

num)

virtual

double

getnum1()

virtual

void setnum2(double

num)

virtual

double

getnum2()

virtual

double

getresult()

private

:

double

mnum1;

double

mnum2;

};

定義具體的運算類:

class operationadd:public

operation

virtual

double

getresult();

};class operationsub: public

operation

virtual

double

getresult();

};class operationmul:public

operation

virtual

double

getresult();

private:};

class operationdiv:public

operation

virtual

double

getresult();

};

運算方法具體實現:

double

operationadd::getresult()

double

operationsub::getresult()

double

operationmul::getresult()

double

operationdiv::getresult()

else

}

實現簡單工廠方法:

operation* operationfactory(charch)

}

客戶端**

while(1

)

修改:計算數a和數b不同運算的結果。

簡單工廠實現:

int a = 22, b = 2

; operation* p = operationfactory('+'

); p->setnum1(a);

p->setnum2(b);

cout

p = operationfactory('-'

); p->setnum1(a);

p->setnum2(b);

cout

p = operationfactory('*'

); p->setnum1(a);

p->setnum2(b);

cout

p = operationfactory('/'

); p->setnum1(a);

p->setnum2(b);

cout

把題目理解成通過加、減、乘、除 四中策略實現對a、b的運算!

增加類:calculate

class

calculate

void setoperation(char

ch)

void setnum1(double

num1)

void setnum2(double

num2)

double

getresult()

private

: operation*mpoprt;

};則客戶端**:

int a = 22, b = 2

; calculate onecal;

onecal.setnum1(a);

onecal.setnum2(b);

cout

onecal.setoperation('-

');onecal.setnum1(a);

onecal.setnum2(b);

cout

onecal.setoperation('*

');onecal.setnum1(a);

onecal.setnum2(b);

cout

onecal.setoperation('/

');onecal.setnum1(a);

onecal.setnum2(b);

cout

與簡單工廠的實現相比較,策略模式客戶端只需要對乙個物件進行操作,並沒有涉及到具體的策略實現類,使運算演算法與客戶端策底的分離。

而且策略模式更方便不同策略的切換!

策略模式與簡單工廠模式

1,簡單工廠模式 a 有乙個抽象的介面用來表示工廠需要生產的產品共性 然後各個具體的產品類實現該抽象介面。b 工廠只需要持有產品的抽象介面,工廠接收乙個 type 引數來決定生產何種產品。c 對於客戶而言,當他需要某種型別的產品時,只需要獲得工廠物件,然後將產品的 type引數傳遞給工廠,由工廠建立...

策略模式與簡單工廠模式

1,簡單工廠模式 a 有乙個抽象的介面用來表示工廠需要生產的產品共性 然後各個具體的產品類實現該抽象介面。b 工廠只需要持有產品的抽象介面,工廠接收乙個 type 引數來決定生產何種產品。c 對於客戶而言,當他需要某種型別的產品時,只需要獲得工廠物件,然後將產品的 type引數傳遞給工廠,由工廠建立...

簡單工廠模式 策略模式與工廠方法模式

用三種設計模式實現同一種功能 四則運算。三種設計模式相同的部分為四則運算類的設計,包括基類,加法運算類,減法運算類,乘法運算類和除法運算類,其 如下 class cclac class cclacadd public cclac class cclacsub public cclac class c...