簡單工廠
1.模式定義
簡單工廠模式(Simple Factory Pattern):又稱為靜態(tài)工廠方法(Static Factory Method)模式坠非,它屬于類創(chuàng)建型模式敏沉。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實例炎码。
2.模式結(jié)構(gòu)
Factory:工廠角色
工廠角色負責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯
Product:抽象產(chǎn)品角色
抽象產(chǎn)品角色是所創(chuàng)建的所有對象的父類盟迟,負責(zé)描述所有實例所共有的公共接口
ConcreteProduct:具體產(chǎn)品角色
具體產(chǎn)品角色是創(chuàng)建目標,所有創(chuàng)建的對象都充當這個角色的某個具體類的實例潦闲。
Product *Factory::createProduct(string proname) {
if ("A" == proname) {
return new ConcreteProductA();
} else if ("B" == proname) {
return new ConcreteProductB();
}
return NULL;
}
3.優(yōu)缺點
- 優(yōu)點:
- 工廠類含有必要的判斷邏輯攒菠,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品類的實例,客戶端可以免除直接創(chuàng)建產(chǎn)品對象的責(zé)任歉闰,而僅僅“消費”產(chǎn)品辖众。
- 客戶端無須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對應(yīng)的參數(shù)即可和敬。
- 通過引入配置文件凹炸,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,在一定程度上提高了系統(tǒng)的靈活性昼弟。
- 缺點:
- 工廠類集中了所有產(chǎn)品創(chuàng)建邏輯啤它,一旦不能正常工作,整個系統(tǒng)都要受到影響。
- 簡單工廠模式將會增加系統(tǒng)中類的個數(shù)变骡,在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度离赫。
- 系統(tǒng)擴展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯锣光,在產(chǎn)品類型較多時笆怠,有可能造成工廠邏輯過于復(fù)雜,不利于系統(tǒng)的擴展和維護誊爹。
4.適用場景
- 工廠類負責(zé)創(chuàng)建的對象比較少:由于創(chuàng)建的對象較少蹬刷,不會造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜。
- 客戶端只知道傳入工廠類的參數(shù)频丘,對于如何創(chuàng)建對象不關(guān)心:客戶端既不需要關(guān)心創(chuàng)建細節(jié)办成,甚至連類名都不需要記住,只需要知道類型所對應(yīng)的參數(shù)搂漠。
工廠模式
1.模式定義
工廠方法模式(Factory Method Pattern)又稱為工廠模式迂卢,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式桐汤。在工廠方法模式中而克,工廠父類負責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負責(zé)生成具體的產(chǎn)品對象怔毛,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成员萍,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類。
2.模式結(jié)構(gòu)
Product:抽象產(chǎn)品
ConcreteProduct:具體產(chǎn)品
Factory:抽象工廠
ConcreteFactory:具體工廠
Product* ConcreteFactory::factoryMethod(){
return new ConcreteProduct();
}
int main(int argc, char *argv[])
{
Factory * fc = new ConcreteFactory();
Product * prod = fc->factoryMethod();
prod->use();
return 0;
}
3.模式分析
工廠方法模式是簡單工廠模式的進一步抽象和推廣拣度。由于使用了面向?qū)ο蟮亩鄳B(tài)性碎绎,工廠方法模式保持了簡單工廠模式的優(yōu)點,而且克服了它的缺點抗果。在工廠方法模式中筋帖,核心的工廠類不再負責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做冤馏。這個核心類僅僅負責(zé)給出具體工廠必須實現(xiàn)的接口日麸,而不負責(zé)哪一個產(chǎn)品類被實例化這種細節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進新產(chǎn)品宿接。
4.實例
-
結(jié)構(gòu)圖:
-
時序圖:
5.工廠模式的優(yōu)缺點
優(yōu)點:
- 在工廠方法模式中赘淮,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時還向客戶隱藏了哪種具體產(chǎn)品類將被實例化這一細節(jié)睦霎,用戶只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細節(jié)走诞,甚至無須知道具體產(chǎn)品類的類名副女。
- 一個類通過其子類來指定創(chuàng)建哪個對象:在工廠方法模式中,對于抽象工廠類只需要提供一個創(chuàng)建產(chǎn)品的接口蚣旱,而由其子類來確定具體要創(chuàng)建的對象碑幅,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則戴陡,在程序運行時,子類對象將覆蓋父類對象沟涨,從而使得系統(tǒng)更容易擴展恤批。
- 將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類裹赴,需要時再動態(tài)指定喜庞,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。
缺點:
- 在添加新產(chǎn)品時棋返,需要編寫新的具體產(chǎn)品類延都,而且還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加睛竣,在一定程度上增加了系統(tǒng)的復(fù)雜度晰房,有更多的類需要編譯和運行,會給系統(tǒng)帶來一些額外的開銷射沟。
- 由于考慮到系統(tǒng)的可擴展性殊者,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義验夯,增加了系統(tǒng)的抽象性和理解難度猖吴,且在實現(xiàn)時可能需要用到DOM、反射等技術(shù)簿姨,增加了系統(tǒng)的實現(xiàn)難度距误。
6.適用場景
- 一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名扁位,只需要知道所對應(yīng)的工廠即可准潭,具體的產(chǎn)品對象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類域仇。
- 一個類通過其子類來指定創(chuàng)建哪個對象:在工廠方法模式中刑然,對于抽象工廠類只需要提供一個創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要創(chuàng)建的對象暇务,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則泼掠,在程序運行時,子類對象將覆蓋父類對象垦细,從而使得系統(tǒng)更容易擴展择镇。
- 將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類括改,需要時再動態(tài)指定腻豌,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。
7.模式應(yīng)用
Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://loc
alhost:1433; DatabaseName=DB;user=sa;password=");
Statement statement=conn.createStatement();
ResultSet rs=statement.executeQuery("select * from UserInfo");
8.參考文章
http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html
抽象工廠模式
1.模式定義
抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類吝梅。抽象工廠模式又稱為Kit模式虱疏,屬于對象創(chuàng)建型模式。
2.模式結(jié)構(gòu)
抽象工廠模式包含如下角色:
- AbstractFactory:抽象工廠
- ConcreteFactory:具體工廠
- AbstractProduct:抽象產(chǎn)品
-
Product:具體產(chǎn)品
3.代碼分析
int main(int argc, char *argv[])
{
AbstractFactory * fc = new ConcreteFactory1();
AbstractProductA * pa = fc->createProductA();
AbstractProductB * pb = fc->createProductB();
pa->use();
pb->eat();
AbstractFactory * fc2 = new ConcreteFactory2();
AbstractProductA * pa2 = fc2->createProductA();
AbstractProductB * pb2 = fc2->createProductB();
pa2->use();
pb2->eat();
}
#include "ConcreteFactory1.h"
#include "ProductA1.h"
#include "ProductB1.h"
AbstractProductA * ConcreteFactory1::createProductA(){
return new ProductA1();
}
AbstractProductB * ConcreteFactory1::createProductB(){
return new ProductB1();
}
#include "ProductA1.h"
#include <iostream>
using namespace std;
void ProductA1::use(){
cout << "use Product A1" << endl;
}
4.優(yōu)缺點
優(yōu)點
- 抽象工廠模式隔離了具體類的生成苏携,使得客戶并不需要知道什么被創(chuàng)建做瞪。由于這種隔離,更換一個具體工廠就變得相對容易右冻。所有的具體工廠都實現(xiàn)了抽象工廠中定義的那些公共接口装蓬,因此只需改變具體工廠的實例,就可以在某種程度上改變整個軟件系統(tǒng)的行為国旷。另外矛物,應(yīng)用抽象工廠模式可以實現(xiàn)高內(nèi)聚低耦合的設(shè)計目的,因此抽象工廠模式得到了廣泛的應(yīng)用跪但。
- 當一個產(chǎn)品族中的多個對象被設(shè)計成一起工作時履羞,它能夠保證客戶端始終只使用同一個產(chǎn)品族中的對象。這對一些需要根據(jù)當前環(huán)境來決定其行為的軟件系統(tǒng)來說屡久,是一種非常實用的設(shè)計模式忆首。
- 增加新的具體工廠和產(chǎn)品族很方便,無須修改已有系統(tǒng)被环,符合“開閉原則”糙及。
缺點
- 在添加新的產(chǎn)品對象時,難以擴展抽象工廠來生產(chǎn)新種類的產(chǎn)品筛欢,這是因為在抽象工廠角色中規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合浸锨,要支持新種類的產(chǎn)品就意味著要對該接口進行擴展,而這將涉及到對抽象工廠角色及其所有子類的修改版姑,顯然會帶來較大的不便柱搜。
- 開閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易,增加新的產(chǎn)品等級結(jié)構(gòu)麻煩)剥险。
5.適用場景
在以下情況下可以使用抽象工廠模式:
- 一個系統(tǒng)不應(yīng)當依賴于產(chǎn)品類實例如何被創(chuàng)建聪蘸、組合和表達的細節(jié),這對于所有類型的工廠模式都是重要的表制。
- 系統(tǒng)中有多于一個的產(chǎn)品族健爬,而每次只使用其中某一產(chǎn)品族。
- 屬于同一個產(chǎn)品族的產(chǎn)品將在一起使用么介,這一約束必須在系統(tǒng)的設(shè)計中體現(xiàn)出來娜遵。
- 系統(tǒng)提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn)壤短,從而使客戶端不依賴于具體實現(xiàn)魔熏。
6.參考文章
http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html