專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。它又稱為靜態工廠方法模式,屬於類的建立型模式。簡單工廠模式的實質是由乙個工廠類根據傳入的引數,動態決定應該建立哪乙個產品類(這些產品類繼承自乙個父類或介面)的例項。
該模式中包含的角色及其職責:
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 = 2calculate; 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
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...