iOS設(shè)計模式(4)抽象工廠模式

設(shè)計模式系列文章

《iOS設(shè)計模式(1)簡單工廠模式》
《iOS設(shè)計模式(2)工廠模式》
《iOS設(shè)計模式(3)適配器模式》
《iOS設(shè)計模式(5)策略模式》
《iOS設(shè)計模式(6)模板模式》
《iOS設(shè)計模式(7)建造者模式》

1.概念描述

今天我們學(xué)習(xí)一下抽象工廠模式甫匹,照例先把百度百科上的正規(guī)解釋給大家展示出來看看弃甥。

抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)舌仍。抽象工廠模式是指當(dāng)有多個抽象角色時,使用的一種工廠模式菱阵。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產(chǎn)品的具體的情況下席里,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象。根據(jù)里氏替換原則遥诉,任何接受父類型的地方,都應(yīng)當(dāng)能夠接受子類型噪叙。因此矮锈,實際上系統(tǒng)所需要的,僅僅是類型與這些抽象產(chǎn)品角色相同的一些實例睁蕾,而不是這些抽象產(chǎn)品的實例苞笨。換言之,也就是這些抽象產(chǎn)品的具體子類的實例子眶。工廠類負責(zé)創(chuàng)建抽象產(chǎn)品的具體子類的實例瀑凝。---百度百科

在上面抽象工廠模式的定義中涉及到了一個名詞:產(chǎn)品族。他的意思是有多類產(chǎn)品臭杰,每一類產(chǎn)品中又分多種相似的產(chǎn)品粤咪。下面是百度百科的解釋:

是指位于不同產(chǎn)品等級結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族渴杆。一般是位于不同的等級結(jié)構(gòu)中的相同位置上寥枝。顯然,每一個產(chǎn)品族中含有產(chǎn)品的數(shù)目磁奖,與產(chǎn)品等級結(jié)構(gòu)的數(shù)目是相等的囊拜,形成一個二維的坐標(biāo)系,水平坐標(biāo)是產(chǎn)品等級結(jié)構(gòu)比搭,縱坐標(biāo)是產(chǎn)品族冠跷。叫做相圖。---百度百科

EnMJbi.gif
2.實例場景

看過《iOS設(shè)計模式(1)簡單工廠模式》《iOS設(shè)計模式(2)工廠模式》的同學(xué)知道在前兩篇文章中我們舉了一個汽車牌照的例子身诺,本文繼續(xù)承接上兩篇文章中的例子蔽莱。

在現(xiàn)實生活中的汽車牌照沒有咱們例子中那么簡單。除了國家規(guī)定不同類型的車輛所上的牌照不同意外戚长,不同省份的牌照生成規(guī)則也不一樣盗冷,最明顯的就是牌照號中那唯一的漢字,比如北京市的牌照就是“京X·XXXXX”同廉,而河北省的牌照就是“冀X·XXXXX”仪糖,當(dāng)然同一省份不同地區(qū)的牌照在漢字后面的那個字母也不一樣。

今天咱們只看不同省份牌照不一樣的需求怎么解決迫肖。這就需要我們在之前定義的藍色車牌和黃色車牌(LHBlueCarLicense和LHYellowCarLicense)中再派生出不同地區(qū)的藍色車牌和黃色車牌類锅劝。這里我們就舉北京和河北兩個例子:LHBeijingBlueCarLicense、LHBeijingYellowCarLicense和LHHebeiBlueCarLicense蟆湖、LHHebeiYellowCarLicense故爵。

3.代碼實現(xiàn)

兩個車牌基類:藍色車牌和黃色車牌

#import "LHCarLicenseProtocol.h"

@interface LHBlueCarLicense : NSObject<LHCarLicenseProtocol>

@property(nonatomic, copy)NSString              *city; // 城市

@end

#import "LHBlueCarLicense.h"

@implementation LHBlueCarLicense

// 打印車牌號
- (NSString *)printLicenseNumber{
    return nil;
}

@end
#import "LHCarLicenseProtocol.h"

@interface LHYellowCarLicense : NSObject<LHCarLicenseProtocol>

@property(nonatomic, copy)NSString              *city; // 城市

@end

#import "LHYellowCarLicense.h"

@implementation LHYellowCarLicense

// 打印牌照號
- (NSString *)printLicenseNumber{
    
    return nil;
}

@end

下面是北京藍色車牌和黃色車牌類實現(xiàn)(河北車牌代碼一樣,這里就不再貼代碼了)

#import "LHBlueCarLicense.h"

@interface LHBeijingBlueCarLicense : LHBlueCarLicense

@property(nonatomic, copy, readonly)NSString    *licenseNumber; // 車牌號

@end

#import "LHBeijingBlueCarLicense.h"
#import "LHCommonClass.h"

@implementation LHBeijingBlueCarLicense

// 打印牌照號
- (NSString *)printLicenseNumber{
    self.city = @"京";
    _licenseNumber = [LHCommonClass getLicenseNumberWithCity:self.city];
    return [NSString stringWithFormat:@"北京藍色車牌號:%@",_licenseNumber];
}

@end
#import "LHYellowCarLicense.h"

@interface LHBeijingYellowCarLicense : LHYellowCarLicense

@property(nonatomic, copy, readonly)NSString    *licenseNumber; // 車牌號

@end

#import "LHBeijingYellowCarLicense.h"
#import "LHCommonClass.h"

@implementation LHBeijingYellowCarLicense

// 打印牌照號
- (NSString *)printLicenseNumber{
    self.city = @"京";
    _licenseNumber = [LHCommonClass getLicenseNumberWithCity:self.city];
    return [NSString stringWithFormat:@"北京黃色車牌號:%@",_licenseNumber];
}

@end

產(chǎn)品族類定義完成后隅津,下面我們看工廠類的實現(xiàn)诬垂。之前我們的工廠類定義的是藍色車牌工廠類和黃色車牌工廠類劲室,在抽象工廠模式中我們要定義的是北京車牌工廠類和河北車牌工廠類。我們先看工廠基類的定義

#import <Foundation/Foundation.h>

@class LHBlueCarLicense;
@class LHYellowCarLicense;

@interface LHCarLicenseFactory : NSObject

/**
 *  獲取藍色牌照工廠
 *
 *  @return 返回牌照對象
 */
+ (LHBlueCarLicense *)createBlueCarLicense;

/**
 *  獲取黃色牌照工廠
 *
 *  @return 返回牌照對象
 */
+ (LHYellowCarLicense *)createYellowCarLicense;

@end

#import "LHCarLicenseFactory.h"
#import "LHBlueCarLicense.h"
#import "LHYellowCarLicense.h"

@implementation LHCarLicenseFactory

// 獲取藍色牌照工廠
+ (LHBlueCarLicense *)createBlueCarLicense
{
    return nil;
}

// 獲取黃色牌照工廠
+ (LHYellowCarLicense *)createYellowCarLicense
{
    return nil;
}

@end

下面看北京工廠類的實現(xiàn)(河北工廠類代碼實現(xiàn)一樣结窘,不在這里貼了)

#import "LHCarLicenseFactory.h"

@interface LHBeijingCarLicenseFactory : LHCarLicenseFactory

@end

#import "LHBeijingCarLicenseFactory.h"
#import "LHBlueCarLicense.h"
#import "LHYellowCarLicense.h"
#import "LHBeijingBlueCarLicense.h"
#import "LHBeijingYellowCarLicense.h"

@implementation LHBeijingCarLicenseFactory

// 北京藍色牌照
+ (LHBlueCarLicense *)createBlueCarLicense
{
    LHBlueCarLicense *_license = [[LHBeijingBlueCarLicense alloc] init];
    return _license;
}

// 北京黃色牌照
+ (LHYellowCarLicense *)createYellowCarLicense
{
    LHYellowCarLicense *_license = [[LHBeijingYellowCarLicense alloc] init];
    return _license;
}

@end

那么客戶端的調(diào)用就簡單多了

// 北京藍色牌照點擊事件
- (IBAction)btnBeijingBlueEvent:(UIButton *)sender {
    LHBlueCarLicense *_license = [LHBeijingCarLicenseFactory createBlueCarLicense];
    _lbText.text = [NSString stringWithFormat:@"%@\n%@",_lbText.text,_license.printLicenseNumber];
}

// 北京黃色牌照點擊事件
- (IBAction)btnBeijingYellowEvent:(UIButton *)sender {
    LHYellowCarLicense *_license = [LHBeijingCarLicenseFactory createYellowCarLicense];
    _lbText.text = [NSString stringWithFormat:@"%@\n%@",_lbText.text,_license.printLicenseNumber];
}

輸出結(jié)果:

WechatIMG2.jpeg

這樣很洋,抽象工廠模式代碼實現(xiàn)就完成了。不過個人覺得抽象模式還是比較復(fù)雜的隧枫,而且擴展擴展起來也不是很靈活喉磁,如果產(chǎn)品族非常多的話會生成很多產(chǎn)品類出來,是一件恐怖的事情官脓。所以有人結(jié)合簡單工廠模式和工廠模式协怒,利用反射(java)機制對抽象工廠模式進行優(yōu)化,避免生成太多的產(chǎn)品類卑笨。感興趣的同學(xué)可以看看這篇文章

源碼下載


引用
配圖引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斤讥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子湾趾,更是在濱河造成了極大的恐慌芭商,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搀缠,死亡現(xiàn)場離奇詭異铛楣,居然都是意外死亡,警方通過查閱死者的電腦和手機艺普,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門簸州,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歧譬,你說我怎么就攤上這事岸浑。” “怎么了瑰步?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵矢洲,是天一觀的道長。 經(jīng)常有香客問我缩焦,道長读虏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任袁滥,我火速辦了婚禮盖桥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘题翻。我一直安慰自己揩徊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著塑荒,像睡著了一般熄赡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袜炕,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音初家,去河邊找鬼偎窘。 笑死,一個胖子當(dāng)著我的面吹牛溜在,可吹牛的內(nèi)容都是我干的陌知。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼掖肋,長吁一口氣:“原來是場噩夢啊……” “哼仆葡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起志笼,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤沿盅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纫溃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腰涧,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年紊浩,在試婚紗的時候發(fā)現(xiàn)自己被綠了窖铡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坊谁。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡费彼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出口芍,到底是詐尸還是另有隱情箍铲,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布鬓椭,位于F島的核電站虹钮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏膘融。R本人自食惡果不足惜芙粱,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氧映。 院中可真熱鬧春畔,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至择份,卻和暖如春扣孟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荣赶。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工凤价, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拔创。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓利诺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剩燥。 傳聞我的和親對象是個殘疾皇子慢逾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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