Objective-C繼承多態(tài)靜態(tài)工廠模式

繼承和多態(tài)

靜態(tài)工廠方法模式

#import <Foundation/Foundation.h>
// objective-c 推薦用以下方式創(chuàng)建枚舉
typedef  NS_ENUM(NSUInteger, ZPEmployeeType) {
    ZPEmployeeTypeManager,
    ZPEmployeeTypeEngineer,
    ZPEmployeeTypeSalesman
};

@interface ZPEmployee : NSObject
/**名字*/
@property (nonatomic, copy) NSString *name;

/**工資*/
@property (nonatomic, readonly) double salary;// 只讀芍殖,要寫(xiě)getter方法

/**初始化*/
// 隱藏多種員工子類型的細(xì)節(jié)只暴露員工接口給用戶調(diào)用
+ (instancetype) employeeWithType:(ZPEmployeeType) type;
@end
#import "ZPEmployee.h"
#import "ZPEngineer.h"
#import "ZPManager.h"
#import "ZPSalesman.h"

@implementation ZPEmployee
// 終極原則:高內(nèi)聚 低耦合

// 面向?qū)ο笃咴瓌t:
// 單一職責(zé)原則
// 開(kāi)閉原則
// 依賴倒轉(zhuǎn)原則
// 里氏替換原則
// 接口隔離原則
// 合成聚合復(fù)用原則
// 迪米特法則

// GoF設(shè)計(jì)模式(23種設(shè)計(jì)模式)
// 創(chuàng)建型模式:?jiǎn)卫自椤⒐S
// 結(jié)構(gòu)型模式:適配器、門(mén)面什荣、裝潢访娶、橋梁
// 行為型模式:觀察者商虐、代理


//類簇 (class cluster)
// 設(shè)計(jì)模式:靜態(tài)工廠方法模式
+ (instancetype) employeeWithType:(ZPEmployeeType) type {
    ZPEmployee *employee = nil;
    switch (type) {
        case ZPEmployeeTypeManager:
            employee = [[ZPManager alloc] init];
            break;
        case ZPEmployeeTypeEngineer:
            employee = [[ZPEngineer alloc] init];
            break;
        case ZPEmployeeTypeSalesman:
            employee = [ZPSalesman new];
            break;
    }
    return employee;
}

@end


#import "ZPEmployee.h"
/**部門(mén)經(jīng)理*/
@interface ZPManager : ZPEmployee

@end

#import "ZPManager.h"

@implementation ZPManager

- (double) salary {
    return 10000;
}

@end


#import "ZPEmployee.h"
/**技術(shù)工人*/
@interface ZPEngineer : ZPEmployee

/**工作時(shí)間*/
@property (nonatomic, strong) NSNumber *workingHour;

@end

#import "ZPEngineer.h"

@implementation ZPEngineer

- (double) salary {
    return 200 * [_workingHour integerValue];
}

@end


#import "ZPEmployee.h"
/**銷(xiāo)售員*/
@interface ZPSalesman : ZPEmployee

/**銷(xiāo)售額*/
@property (nonatomic, strong) NSNumber *sales;

@end

#import "ZPSalesman.h"

@implementation ZPSalesman

- (double)salary {
    return 1500 + 0.05 * [_sales doubleValue];
}

@end
#import <Foundation/Foundation.h>
#import "ZPManager.h"
#import "ZPSalesman.h"
#import "ZPEngineer.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *empNames = @[@"馬超", @"趙云", @"典韋", @"許褚", @"陸遜", @"魏延",@"張飛"];
        NSMutableArray *empsArray = [@[] mutableCopy];
        for (NSString *name in empNames) {
            ZPEmployee *emp = [ZPEmployee employeeWithType:arc4random() % 3];
            emp.name = name;
            [empsArray addObject:emp];
//            ZPEmployee *emp = nil;
//            int num =  arc4random() % 3;
//            switch (num) {
//                case 0:
//                    emp = [ZPManager managerWithName:name];
//                    break;
//                case 1:
//                    emp = [ZPEngineer engineerWithName:name];
//                    break;
//                case 2:
//                    emp = [ZPSalesman salesmanWithName:name];
//                    break;
//            }
//            [empsArray addObject:emp];
        }
        for (ZPEmployee *emp in empsArray) {
            //printf("%s", emp.name.UTF8String);
            // 判斷類型
            if ([emp isKindOfClass:[ZPEngineer class]]) {
                printf("請(qǐng)輸入%s的本月工作時(shí)間: ", emp.name.UTF8String);
                int workingHour;
                scanf("%d", &workingHour);
                // 通過(guò)選擇器去執(zhí)行對(duì)象方法。
                [emp performSelector:@selector(setWorkingHour:) withObject:@(workingHour)];
                //將父類型指針轉(zhuǎn)換成子類型指針(向下轉(zhuǎn)型崖疤,需要強(qiáng)制類型轉(zhuǎn)換)
                // ZPEngineer *engineer = (ZPEngineer *)emp;
                // engineer.workingHour  =  @(workingHour);
            }
            else if ([emp isKindOfClass:[ZPSalesman class]]) {
                printf("請(qǐng)輸入%s的本月的銷(xiāo)售額: ", emp.name.UTF8String);
                double sales;
                scanf("%lf", &sales);
                // id 是任意類型的指針
                [emp performSelector:@selector(setSales:) withObject:@(sales)];
                // ZPSalesman *salesman = (id) emp;
                // salesman.sales = @(sales);
            }
            printf("%s本月工資為:$%.1f\n", emp.name.UTF8String, emp.salary);
        }
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秘车,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劫哼,更是在濱河造成了極大的恐慌叮趴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件权烧,死亡現(xiàn)場(chǎng)離奇詭異眯亦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)般码,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)妻率,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人板祝,你說(shuō)我怎么就攤上這事宫静。” “怎么了券时?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵孤里,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我橘洞,道長(zhǎng)捌袜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任震檩,我火速辦了婚禮琢蛤,結(jié)果婚禮上蜓堕,老公的妹妹穿的比我還像新娘。我一直安慰自己博其,他們只是感情好套才,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著慕淡,像睡著了一般背伴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峰髓,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天傻寂,我揣著相機(jī)與錄音,去河邊找鬼携兵。 笑死疾掰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的徐紧。 我是一名探鬼主播静檬,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼并级!你這毒婦竟也來(lái)了拂檩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嘲碧,失蹤者是張志新(化名)和其女友劉穎稻励,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體愈涩,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡望抽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钠署。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糠聪。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谐鼎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趣惠,我是刑警寧澤狸棍,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站味悄,受9級(jí)特大地震影響草戈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侍瑟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一唐片、第九天 我趴在偏房一處隱蔽的房頂上張望丙猬。 院中可真熱鬧,春花似錦费韭、人聲如沸茧球。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抢埋。三九已至,卻和暖如春督暂,著一層夾襖步出監(jiān)牢的瞬間揪垄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工逻翁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饥努,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓八回,卻偏偏與公主長(zhǎng)得像肪凛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辽社,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 簡(jiǎn)單工廠模式雖然簡(jiǎn)單伟墙,但存在一個(gè)很?chē)?yán)重的問(wèn)題。當(dāng)系統(tǒng)中需要引入新產(chǎn)品時(shí)滴铅,由于靜態(tài)工廠方法通過(guò)所傳入?yún)?shù)的不同來(lái)創(chuàng)建...
    justCode_閱讀 1,187評(píng)論 1 9
  • 設(shè)計(jì)原則: 要依賴抽象戳葵,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是工廠方法模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,344評(píng)論 0 6
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用汉匙、多...
    MinoyJet閱讀 3,947評(píng)論 1 15
  • 點(diǎn)開(kāi)日歷拱烁,看到手機(jī)日歷上居然也把明天就是雙十一標(biāo)上“光棍節(jié)”,簡(jiǎn)直了噩翠。明明是商家為了促銷(xiāo)搞的一個(gè)噱頭戏自,如今卻被人人...
    花悠然閱讀 345評(píng)論 2 2
  • 8月14日凌晨擅笔,王寶強(qiáng)發(fā)表離婚聲明,在其離婚聲明中表示:“現(xiàn)因馬蓉與我經(jīng)紀(jì)人宋喆的婚外不正當(dāng)兩性關(guān)系屯援,嚴(yán)重傷害了婚...
    虹飛閱讀 383評(píng)論 5 1