簡(jiǎn)單工廠模式+反射動(dòng)態(tài)生產(chǎn)cell

最近手頭里沒(méi)太多的工作就把之前的代碼整了整,梳理了之前的各種工廠模式蒸其,算是又學(xué)習(xí)了一遍顾患。

簡(jiǎn)單工廠和工廠模式的區(qū)別:
簡(jiǎn)單工廠在工廠類中融入了邏輯判斷,雖然和客戶端解耦合但也違背了開(kāi)放封閉的原則产阱,再添加新功能時(shí)要去修改之前的代碼;工廠模式則把邏輯從工廠類移到了客戶端類块仆,雖然在客戶端進(jìn)行必要的邏輯判斷构蹬,卻可以進(jìn)行擴(kuò)展不必修改之前的代碼。

因?yàn)楹?jiǎn)單工廠破壞了開(kāi)放封閉原則需要對(duì)原來(lái)的代碼進(jìn)行改動(dòng)悔据,所以這里配合了反射模式來(lái)消除這一不利的影響庄敛,達(dá)到即使不去修改工廠類也能進(jìn)行擴(kuò)展的效果。

這里要注意科汗,用反射模式配合需要事先約定好一系列的命名規(guī)則藻烤。整個(gè)邏輯是利用Model通過(guò)工廠反射來(lái)創(chuàng)建對(duì)應(yīng)的Cell。

cell基類(每個(gè)新產(chǎn)生的cell都要繼承cell基類):

.h
#import <UIKit/UIKit.h>
@class JWBaseModel;
@interface JWBaseCell : UITableViewCell

/**
 *  用model為cell賦值头滔,基類不做處理怖亭,子類重寫這個(gè)方法
 *
 *  @param model 繼承基類的model
 */
- (void)setUpValueForCellWithModel:(JWBaseModel *)model;

/**
 *  設(shè)置代理
 */
- (void)setUpDelegateWithVC:(id)vc;
.m中兩個(gè)方法都只是空方法不做任何處理,子類去重寫這個(gè)方法
#import "JWBaseCell.h"

@implementation JWBaseCell

#pragma mark 用model為cell賦值坤检,基類不作處理
- (void)setUpValueForCellWithModel:(JWBaseModel *)model {

}

#pragma mark 設(shè)置代理
- (void)setUpDelegateWithVC:(id)vc {
    
}

model基類(每個(gè)新產(chǎn)生的model都要繼承model基類):空類就不貼了兴猩,可以自行加一些空值判斷或者計(jì)算行高之類的基類方法供子類使用

簡(jiǎn)單工廠類(通過(guò)反射來(lái)替代傳值判斷):

.h
#import <Foundation/Foundation.h>
@class JWBaseModel,JWBaseCell;

@interface JWCreatCellManager : NSObject

/**
 *  動(dòng)態(tài)創(chuàng)建cell
 *
 *  @param model 繼承基類的model
 *
 *  @return 繼承基類的cell
 */
+ (JWBaseCell *)creatCellWithModel:(JWBaseModel *)model;

@end

.m  這里要注意一定要有自己的命名規(guī)則,在使用時(shí)嚴(yán)格按照命名規(guī)則來(lái)生成類名  
下面的代碼需要cell和model命名有對(duì)應(yīng)關(guān)系   XXXCell ---- XXXModel   XXX內(nèi)容一樣

#import "JWCreatCellManager.h"
#import "JWBaseCell.h"
#import "JWBaseModel.h"

@implementation JWCreatCellManager

#pragma mark 動(dòng)態(tài)創(chuàng)建cell
+ (JWBaseCell *)creatCellWithModel:(JWBaseModel *)model {
    //提取類名
    NSString *className = NSStringFromClass([model class]);
    //處理類名
    NSString *resultName = [className stringByReplacingOccurrencesOfString:@"Model" withString:@"Cell"];
    Class objectClass = NSClassFromString(resultName);
    JWBaseCell *cell = [[objectClass alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:className];
    return cell;
}

@end


在使用時(shí)只需要改變創(chuàng)建的model就能自動(dòng)拿出對(duì)應(yīng)的cell早歇,返回cell的代碼如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    JWBaseModel *model = _dataArray[indexPath.row];
    JWBaseCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([model class])];
    if (!cell) {
        cell = [JWCreatCellManager creatCellWithModel:model];
    }
    [cell setUpDelegateWithVC:self];
    [cell setUpValueForCellWithModel:model];
    return cell;
}

當(dāng)然我們可以讓子類的model具備更多的特性倾芝,分散更多的代碼讨勤,例如基類中增加計(jì)算行高的方法在子類中重寫。

這種簡(jiǎn)單工廠+反射的模式使得我不用再去修改工廠類中的代碼晨另。我把這種vc中帶一個(gè)tabview的控制器直接提取成了一個(gè)基類潭千,在簡(jiǎn)單的頁(yè)面中直接使用。這種方式使得代碼更加精簡(jiǎn)借尿、耦合度低刨晴、復(fù)用性高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末垛玻,一起剝皮案震驚了整個(gè)濱河市割捅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帚桩,老刑警劉巖亿驾,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異账嚎,居然都是意外死亡莫瞬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門郭蕉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疼邀,“玉大人,你說(shuō)我怎么就攤上這事召锈∨哉瘢” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵涨岁,是天一觀的道長(zhǎng)拐袜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)梢薪,這世上最難降的妖魔是什么蹬铺? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮秉撇,結(jié)果婚禮上甜攀,老公的妹妹穿的比我還像新娘。我一直安慰自己琐馆,他們只是感情好规阀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘦麸,像睡著了一般姥敛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞎暑,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天彤敛,我揣著相機(jī)與錄音,去河邊找鬼了赌。 笑死墨榄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勿她。 我是一名探鬼主播袄秩,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逢并!你這毒婦竟也來(lái)了之剧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砍聊,失蹤者是張志新(化名)和其女友劉穎背稼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體玻蝌,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟹肘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俯树。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帘腹。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖许饿,靈堂內(nèi)的尸體忽然破棺而出阳欲,到底是詐尸還是另有隱情,我是刑警寧澤陋率,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布球化,位于F島的核電站,受9級(jí)特大地震影響翘贮,放射性物質(zhì)發(fā)生泄漏赊窥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一狸页、第九天 我趴在偏房一處隱蔽的房頂上張望锨能。 院中可真熱鬧,春花似錦芍耘、人聲如沸址遇。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倔约。三九已至,卻和暖如春坝初,著一層夾襖步出監(jiān)牢的瞬間浸剩,已是汗流浹背钾军。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绢要,地道東北人吏恭。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像重罪,于是被迫代替她去往敵國(guó)和親樱哼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • 該文章屬于劉小壯原創(chuàng)剿配,轉(zhuǎn)載請(qǐng)注明:劉小壯[http://www.reibang.com/u/2de707c93d...
    劉小壯閱讀 12,763評(píng)論 29 59
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,183評(píng)論 25 707
  • 從最簡(jiǎn)單的例子開(kāi)始 想要執(zhí)行代碼搅幅,必須要先要進(jìn)行編譯。JavaScript的編譯過(guò)程很短呼胚,就在執(zhí)行代碼之前茄唐。 編譯...
    昵稱最難起閱讀 248評(píng)論 0 0
  • 幸福,是人類生活永恒的主題砸讳。怎樣能獲得幸福琢融?有太多書籍和心靈雞湯在告誡我們,怎樣和領(lǐng)導(dǎo)相處簿寂,使親人開(kāi)心漾抬,讓別人喜歡...
    蘭啟昌閱讀 654評(píng)論 0 2
  • 中秋-黃昏 舉頭明月升一輪, 忘卻煙塵浮滾滾常遂。 近旁佳人笑似水纳令, 最美不過(guò)近黃昏。
    ArtisanTQ閱讀 131評(píng)論 0 1