“對象創(chuàng)建”模式
通過“對象創(chuàng)建”模式繞開new讲婚,來避免對象創(chuàng)建(new)過程中所導(dǎo)致的緊耦合(依賴具體類)亭病,從而支持對象創(chuàng)建的穩(wěn)定年局。它是接口抽象之后的第一步工作悬垃。其中包括工廠方法(Factory Method),抽象工廠(Abstract Factory)娱仔,原型模式(Prototype)鱼鸠,建造者模式(Builder)煎源。
工廠模式(Factory)
工廠方法(Factory Method)
模式定義
定義一個用于創(chuàng)建對象的接口墓塌,讓子類決定實例化哪一個類。Factory Method使得一個類的實例化延遲到子類奥额。
工廠提供FactoryMethod()的虛接口苫幢,在ConcreteCreator中實現(xiàn),這里假定有個ConcreteCreator垫挨,只生產(chǎn)ConcreteProduct產(chǎn)品韩肝。
以ConcreteCreator為例,代碼框架如下:
class ConcreteCreator: public Factory
{
virtual Product* CreateProduct()
{
return new ConcreteProduct();
}
};
在客戶端用 Factory *f ; f->CreateProduct();就可以得到ConcreteProduct的對象了九榔。
- Factory Method模式用于隔離類對象的使用者和具體類型之間的耦合關(guān)系哀峻。面對一個經(jīng)常變化的具體類型涡相,緊耦合關(guān)系(new)會導(dǎo)致軟件的脆弱。
- Factory Method模式通過面向?qū)ο蟮氖址ㄊs埃瑢⑺獎?chuàng)建的具體對象工作延遲到子類催蝗,從而實現(xiàn)一種擴(kuò)展(而非更改)的策略,較好地解決了這種緊耦合關(guān)系育特。
- Factory Method模式解決“單個對象”的需求變化丙号。缺點在于要求創(chuàng)建方法/參數(shù)相同。
抽象工廠(Abstract Factory)
模式定義
提供一個接口缰冤,讓該接口負(fù)責(zé)創(chuàng)建一系列“相關(guān)或者相互依賴的對象”犬缨,無需指定它們具體的類。
抽象工廠又是工廠方法的升級版棉浸,但本質(zhì)是相同的怀薛。由圖可以看到不同的地方在于多了一個抽象產(chǎn)品的類。
ConcreateFactory1只生產(chǎn)ProductA1和ProductB1迷郑,即下標(biāo)帶“1”的產(chǎn)品枝恋。在ConcreteFactory1中的兩個方法應(yīng)該如下:
AbstractProductA* CreateProductA()
{
return new ProductA1();
}
AbstractProductB* CreateProductB()
{
return new ProductB1();
}
- 如果沒有應(yīng)對“多系列對象構(gòu)建”的需求變化,則沒有必要使用Abstract Factory模式三热,這時候使用簡單的工廠完全可以鼓择。
- “系列對象”指的是在某一特定系列下的對象之間有相互依賴或作用的關(guān)系。不同系類的對象之間不能相互依賴就漾。
- Abstract Factory模式主要在與應(yīng)對“新系列”的需求變動呐能。其缺點在于難以應(yīng)對“新對象”的需求變動。
總結(jié)
工廠方法:
一個抽象產(chǎn)品類抑堡,可以派生出多個具體產(chǎn)品類摆出。
一個抽象工廠類,可以派生出多個具體工廠類首妖。
每個具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例偎漫。
抽象工廠:
多個抽象產(chǎn)品類,每個抽象產(chǎn)品類可以派生出多個具體產(chǎn)品類有缆。
一個抽象工廠類象踊,可以派生出多個具體工廠類。
每個具體工廠類可以創(chuàng)建多個具體產(chǎn)品類的實例棚壁。
區(qū)別:
工廠方法只有一個抽象產(chǎn)品類杯矩,而抽象工廠有多個。
工廠方法的具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例袖外,而抽象工廠可以創(chuàng)建多個史隆。