設(shè)計模式

工廠模式

鏈接:http://www.reibang.com/p/9cbb18774194

簡單工廠模式

簡單工廠模式并不是常用的設(shè)計模式之一酣倾,它只算是工廠模式的特殊實現(xiàn)∨棵冢可以根據(jù)不同的參數(shù)來實例化不同的對象告组,這些對象通常有共同的父類或者接口煤伟。

適用場景:
需要創(chuàng)建的對象較少。
客戶端不關(guān)心對象創(chuàng)建的過程木缝。

  1. 創(chuàng)建圖像父類Shape
@interface Shape : NSObject

- (void)draw;

@end

2.創(chuàng)建繼承此父類的具體圖形類,分別重寫父類中的draw方法便锨,這里分別創(chuàng)建了圓形、長方形我碟、正方形

#import "Circle.h"
// 圓形類
@implementation Circle

- (void)draw {
    NSLog(@"圓形");
}

@end

#import "Rectangle.h"
// 長方形類
@implementation Rectangle

- (void)draw {
    NSLog(@"長方形");
}

@end

#import "Square.h"
// 正方形類
@implementation Square

- (void)draw {
    NSLog(@"正方形");
}

@end
  1. 創(chuàng)建工廠類放案,用來獲取實例
@implementation ShapeFactory

+ (Shape *)getShape:(ShapeFactoryType)type {
    if (type == ShapeFactoryTypeCircle) {
        return [[Circle alloc] init];
    } else if (type == ShapeFactoryTypeRectangle) {
        return [[Rectangle alloc] init];
    } else if (type == ShapeFactoryTypeSquare) {
        return [[Square alloc] init];
    }
    
    return [[Shape alloc] init];
}

@end
  1. 測試方法
// 簡單工廠模式
Shape *shape = [ShapeFactory getShape:ShapeFactoryTypeCircle];
//    Shape *shape = [ShapeFactory getShape:ShapeFactoryTypeRectangle];
//    Shape *shape = [ShapeFactory getShape:ShapeFactoryTypeSquare];
[shape draw];
工廠模式

工廠模式是簡單工廠模式的進一步深化,在工廠模式中我們將不再提供一個統(tǒng)一的工廠類去創(chuàng)建對象矫俺,而是針對不同的對象提供不同的工廠卿叽。將創(chuàng)建具體產(chǎn)品類的工作延遲到子類去完成

適用場景:
對象創(chuàng)建過程復(fù)雜或?qū)ο髣?chuàng)建要滿足某些條件,使用者不容易掌握恳守,并且也不需要知道具體細(xì)節(jié)考婴。
對象的創(chuàng)建和使用要進行解耦。

示例:
現(xiàn)在需要設(shè)計一個這樣的圖片加載類催烘,它具有多個圖片加載器沥阱,用來加載jpg,png伊群,gif格式的圖片考杉,每個加載器都有一個load()方法,用于讀取圖片舰始。

  1. 創(chuàng)建抽象產(chǎn)品了類崇棠,ImageLoader
@interface ImageLoader : NSObject
 
- (void)loadImage;
 
@end
  1. 創(chuàng)建具體的產(chǎn)品類,PNG加載器丸卷、GIF加載器枕稀、JPG加載器,并復(fù)寫父類的loadImage方法。
#import "PNGImageLoader.h"

@implementation PNGImageLoader

- (void)loadImage {
    NSLog(@"加載PNG格式圖片");
}

@end

#import "GIFImageLoader.h"

@implementation GIFImageLoader

- (void)loadImage {
    NSLog(@"加載GIF格式圖片");
}

@end

#import "JPGImageLoader.h"

@implementation JPGImageLoader

- (void)loadImage {
    NSLog(@"加載JPG格式圖片");
}

@end
  1. 創(chuàng)建工廠抽象類ImageFactory
@interface ImageFactory : NSObject

- (ImageLoader *)getImageLoader;

@end
  1. 創(chuàng)建工廠具體類
#import "PNGImageFactory.h"
#import "PNGImageLoader.h"

@implementation PNGImageFactory

- (ImageLoader *)getImageLoader {
    return [PNGImageLoader new];
}

@end

#import "GIFImageFactory.h"
#import "GIFImageLoader.h"

@implementation GIFImageFactory

- (ImageLoader *)getImageLoader {
    return [GIFImageLoader new];
}

@end

#import "JPGImageFactory.h"
#import "JPGImageLoader.h"

@implementation JPGImageFactory

- (ImageLoader *)getImageLoader {
    return [JPGImageLoader new];
}

@end
  1. 測試方法,只需要知道具體的工廠類即可使用
// 工廠模式
//    ImageFactory *fac = [[PNGImageFactory alloc] init];
//    ImageFactory *fac = [[GIFImageFactory alloc] init];
ImageFactory *fac = [[JPGImageFactory alloc] init];
ImageLoader *imageoadler =[fac getImageLoader];
[imageoadler loadImage];
抽象工廠模式

抽象工廠模式是工廠模式的進一步延伸萎坷,提供了創(chuàng)建了一系列相關(guān)或相互依賴對象的接口凹联。在抽象工廠模式中,每個具體的工廠都提供了多個工廠方法(>=2)用來創(chuàng)建不同類型的具體對象哆档。

適用場景:
和工廠模式一樣客戶端無需知道創(chuàng)建對象的類蔽挠,只需要知道具體工廠類。
需要一組對象共同完成某種功能時瓜浸,并且可能存在多組對象完成不同功能的情況澳淑。
系統(tǒng)結(jié)構(gòu)穩(wěn)定,不會頻繁的增加對象插佛。(增加新的產(chǎn)品族符合開閉原則杠巡,但增加新的產(chǎn)品等級結(jié)構(gòu),需要修改所有的工廠角色朗涩,包括抽象工廠類忽孽,違背了開閉原則)

某軟件公司欲推出一款新的手機游戲軟件,該軟件能夠支持iOS谢床、Android和Windows Mobile等多個智能手機操作系統(tǒng)平臺兄一,針對不同的手機操作系統(tǒng),該游戲軟件提供了不同的游戲操作控制(OperationController)類和游戲界面控制(InterfaceController)類识腿,并提供相應(yīng)的工廠類來封裝這些類的初始化過程出革。軟件要求具有較好的擴展性以支持新的操作系統(tǒng)平臺,為了滿足上述需求渡讼,試采用抽象工廠模式對其進行設(shè)計骂束。

  1. 創(chuàng)建抽象產(chǎn)品類OperationController和InterfaceController
@interface OperationController : NSObject

- (void)control;

@end

@interface InterfaceController : NSObject

- (void)display;

@end
  1. 創(chuàng)建具體產(chǎn)品類,每個系統(tǒng)的操作控制和界面控制成箫,并重寫父類方法
// 操作控制器
#import "WindowsOperationController.h"

@implementation WindowsOperationController

- (void)control {
    NSLog(@"windows 控制器");
}

@end

#import "iOSOperationController.h"

@implementation iOSOperationController

- (void)control {
    NSLog(@"iOS控制器");
}

@end

#import "AndroidOperationController.h"

@implementation AndroidOperationController

- (void)control {
    NSLog(@"Android控制器");
}

@end

// 界面控制器
#import "WindowsInterfaceController.h"

@implementation WindowsInterfaceController

- (void)display {
    NSLog(@"渲染W(wǎng)indows界面");
}

@end

#import "iOSInterfaceController.h"

@implementation iOSInterfaceController

- (void)display {
    NSLog(@"渲染iOS界面");
}

@end

#import "AndroidInterfaceController.h"

@implementation AndroidInterfaceController

- (void)display {
    NSLog(@"渲染Android界面");
}

@end
  1. 創(chuàng)建抽象工廠類
@interface SystemFactory : NSObject

- (OperationController *)getOperation;

- (InterfaceController *)getUI;

@end
  1. 創(chuàng)建具體工廠類
#import "WindowsFactory.h"
#import "WindowsInterfaceController.h"
#import "WindowsOperationController.h"

@implementation WindowsFactory

- (OperationController *)getOperation {
    return [WindowsOperationController new];
}

- (InterfaceController *)getUI {
    return [WindowsInterfaceController new];
}

@end

#import "iOSFactory.h"
#import "iOSInterfaceController.h"
#import "iOSOperationController.h"

@implementation iOSFactory

- (OperationController *)getOperation {
    return [iOSOperationController new];
}

- (InterfaceController *)getUI {
    return [iOSInterfaceController new];
}

@end

#import "AndroidFactory.h"
#import "AndroidInterfaceController.h"
#import "AndroidOperationController.h"

@implementation AndroidFactory

- (OperationController *)getOperation {
    return [AndroidOperationController new];
}

- (InterfaceController *)getUI {
    return [AndroidInterfaceController new];
}

@end
  1. 測試方法
//    SystemFactory *system = [[iOSFactory alloc] init];
//    SystemFactory *system = [[AndroidFactory alloc] init];
SystemFactory *system = [[WindowsFactory alloc] init];
InterfaceController *ui = [system getUI];
OperationController *opera = [system getOperation];
[opera control];
[ui display];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末展箱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹬昌,更是在濱河造成了極大的恐慌混驰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皂贩,死亡現(xiàn)場離奇詭異栖榨,居然都是意外死亡,警方通過查閱死者的電腦和手機明刷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門婴栽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辈末,你說我怎么就攤上這事愚争∮辰裕” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵准脂,是天一觀的道長劫扒。 經(jīng)常有香客問我檬洞,道長狸膏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任添怔,我火速辦了婚禮湾戳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘广料。我一直安慰自己砾脑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布艾杏。 她就那樣靜靜地躺著韧衣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪购桑。 梳的紋絲不亂的頭發(fā)上畅铭,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音勃蜘,去河邊找鬼硕噩。 笑死,一個胖子當(dāng)著我的面吹牛缭贡,可吹牛的內(nèi)容都是我干的炉擅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼阳惹,長吁一口氣:“原來是場噩夢啊……” “哼谍失!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起莹汤,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤快鱼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后体啰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攒巍,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年荒勇,在試婚紗的時候發(fā)現(xiàn)自己被綠了柒莉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沽翔,死狀恐怖兢孝,靈堂內(nèi)的尸體忽然破棺而出窿凤,到底是詐尸還是另有隱情,我是刑警寧澤跨蟹,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布雳殊,位于F島的核電站,受9級特大地震影響窗轩,放射性物質(zhì)發(fā)生泄漏夯秃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一痢艺、第九天 我趴在偏房一處隱蔽的房頂上張望仓洼。 院中可真熱鬧,春花似錦堤舒、人聲如沸色建。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箕戳。三九已至,卻和暖如春国撵,著一層夾襖步出監(jiān)牢的瞬間陵吸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工卸留, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留走越,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓耻瑟,卻偏偏與公主長得像旨指,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喳整,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容