簡(jiǎn)單的工廠
簡(jiǎn)單工廠即通過(guò)另外一個(gè)工廠來(lái)實(shí)例化對(duì)象具有共同基類(lèi)的一組對(duì)象肉拓,這樣完全不需要知道具體類(lèi)的類(lèi)名就可以直接實(shí)例化考杉。
class product{
}
class ConcreteProductA extends product{
}
class ConcreteProductB extends product{
}
class Factory
{
createConcreteProduct(String productType);
{
if (productType == A)
{
return new ConcreteProductA();
}
if (productType == B)
{
return new ConcreteProductB();
}
}
}
工廠方法模式
從簡(jiǎn)單工廠例子引申件蚕,我們把創(chuàng)建ConcreteProductA,ConcreteProductB的實(shí)例放在具體的工廠中去。螺絲放在螺絲的工廠棠枉、輪胎放在輪胎的工廠设褐。
abstract class abstractFactory{
createContreteProduct();
};
class AFactory extends abstractFactory {};
class BFactory extends abstractFactory {};
我們想象以下場(chǎng)景:
在簡(jiǎn)單工程里如果你需要?jiǎng)?chuàng)建productC那么需要修改Factory類(lèi)冗酿,但是如果是工程方法,則只需要增加一個(gè)CFactory即可,這樣更符合“開(kāi)放閉合”原則络断。
對(duì)于工廠方法模式其代碼為:class CFactory extends abstractFactory {}; // 增加一個(gè)CFactory來(lái)解決
對(duì)于簡(jiǎn)單工廠裁替,其具體代碼為:class Factory{ createConcreteProduct(String productType); { if (productType == A) ... if (productType == C) { return new ConcreteProductC(); } } }
工廠方法在實(shí)際中的應(yīng)用
在pass平臺(tái)元數(shù)據(jù)訪問(wèn)層中訪問(wèn)的數(shù)據(jù)有多種多樣,比如有mysql的貌笨,有postgres的弱判,有rest訪問(wèn)的。
在系統(tǒng)中我們通過(guò)dispatcher來(lái)分發(fā)不同類(lèi)型的數(shù)據(jù)處理锥惋,其具體代碼如下:
ObjectDataDispatcher implement IObjectDataService{
create(IObjectData objectData,String type)
{
IObjectDataService dataService= IObjectDataServiceFactory.getInstance(type); //這里用的就是簡(jiǎn)單工廠方法
//如果type是rest,那么dataService獲取的就是AbstractRestDataService
dataService.save(objectData)
}
}
在閱讀源代碼的時(shí)候 如果對(duì)這個(gè)工廠模式有一些梳理膀跌,那么就能夠想到寫(xiě)代碼作者背后的意圖,比如這里是通過(guò)工廠方法來(lái)分別創(chuàng)建 rest/postgres不同的dataservice捅伤,進(jìn)而達(dá)到訪問(wèn)不同數(shù)據(jù)的目的。