簡(jiǎn)單工廠模式
設(shè)計(jì)一個(gè)工廠類(lèi),工廠類(lèi)中提供了一個(gè)接口,這個(gè)接口可以根據(jù)傳入的參數(shù)來(lái)決定創(chuàng)建哪種產(chǎn)品子類(lèi),然后以父類(lèi)的形式返回,這些產(chǎn)品子類(lèi)繼承于同一個(gè)父類(lèi)。
優(yōu)點(diǎn):
- 客戶端不需要知道對(duì)象的實(shí)現(xiàn)過(guò)程,只負(fù)責(zé)對(duì)象的調(diào)用,實(shí)現(xiàn)了調(diào)用與實(shí)現(xiàn)的分離。
- 降低客戶端與子類(lèi)之間的耦合,隱藏子類(lèi)的信息。
- 相比復(fù)雜工廠模式實(shí)現(xiàn)簡(jiǎn)單
缺點(diǎn):
- 當(dāng)產(chǎn)品子類(lèi)增加,需要修改工廠類(lèi),違背了開(kāi)閉原則
- 如果增加的產(chǎn)品子類(lèi)太多,工廠類(lèi)就比較龐大,不利于維護(hù)。
我們什么時(shí)候使用簡(jiǎn)單工廠模式呢?
- 產(chǎn)品子類(lèi)的種類(lèi)比較少
- 這些產(chǎn)品子類(lèi)繼承自同一父類(lèi)
我之前做的一個(gè)關(guān)于地圖的項(xiàng)目,地圖上的控件:羅盤(pán),縮放,比例尺,圖層。都繼承于同一個(gè)父類(lèi),重寫(xiě)父類(lèi)的方法創(chuàng)建子視圖,就可以使用簡(jiǎn)單工廠模式實(shí)現(xiàn)子類(lèi)的創(chuàng)建。
//工廠類(lèi).h
typedef NS_ENUM(NSUInteger, PanelType) {
PanelTypeCompass = 0, //指南針
PanelTypeScale, //比例尺
PanelTypeZoom, //縮放
PanelTypeLayer //圖層
};
@interface PanelFactory : NSObject
//MapViewBasePanel為父類(lèi)
+ (MapViewBasePanel *)factoryOfPanel:(PanelType)panleType;
@end
//工廠類(lèi).m
@implementation PanelFactory
+ (MapViewBasePanel *)factoryOfPanel:(PanelType)panleType {
MapViewBasePanel *panel;
switch (panleType) {
case PanelTypeCompass:
panel = [[MapViewCompassPanel alloc] init];
break;
case PanelTypeScale:
panel = [[MapViewMapScalePanel alloc] init];
break;
case PanelTypeZoom:
panel = [[MapViewZoomPanel alloc] init];
break;
case PanelTypeLayer:
panel = [[MapViewTypePanel alloc] init];
break;
default:
break;
}
return panel;
}
@end
//客戶端調(diào)用
MapViewBasePanel *zoomPanel = [PanelFactory factoryOfPanel:PanelTypeZoom];
[zoomPanel setPanel];
相關(guān)內(nèi)容:開(kāi)放-關(guān)閉原則 :對(duì)修改關(guān)閉,擴(kuò)展開(kāi)放
當(dāng)有新需求時(shí),應(yīng)該在不改變?cè)写a的基礎(chǔ)上,對(duì)現(xiàn)有的類(lèi)進(jìn)行擴(kuò)展,實(shí)現(xiàn)了新需求的功能,又避免了因修改原有代碼而帶來(lái)的風(fēng)險(xiǎn),保持原系統(tǒng)的穩(wěn)定性,利于維護(hù)。