iOS設(shè)計(jì)模式之簡單工廠模式

最近在看關(guān)于設(shè)計(jì)模式的書籍锨亏,開始覺得在設(shè)計(jì)程序架構(gòu)之時(shí),能夠靈活運(yùn)用這些設(shè)計(jì)模式纵诞,代碼將變得非常具有美感上祈。一個(gè)好的設(shè)計(jì)模式使得程序更加的靈活,容易修改浙芙,易于使用登刺。

從最簡單的簡單工廠模式開始學(xué)起,舉一個(gè)實(shí)現(xiàn)計(jì)算器的例子嗡呼,來完成簡單工廠模式纸俭。

一個(gè)簡單計(jì)算器,用四則運(yùn)算來考慮的話南窗,加減乘除揍很,那么初學(xué)者會(huì)覺得很簡單,用if條件來進(jìn)行判斷万伤,判斷好了之后就可以完成要求窒悔,而稍微有經(jīng)驗(yàn)點(diǎn)的 可能會(huì)選擇switch case的判斷方式,例如下面的代碼:

Operation運(yùn)算方法的邏輯

- (void)operationWithnumberA:(double )numberA Withoperator:(char)operator WithnumberB:(double )numberB
{
/**
 *  封裝了一個(gè)傳遞值的方法
 *
 *  @param numberA  數(shù)字A
 *  @param operator 運(yùn)算符
 *  @param numberB  數(shù)字B
 */
    double result = 0;
    
    switch (operator) {
        case 'a':
        result = numberA + numberB;
            break;
            
        case 'b':
            result = numberA - numberB;
            break;
            
        case 'c':
            result = numberA * numberB;
            break;
            
            case 'd':
            if (numberB == 0) {
                NSLog(@"除數(shù)不能為0 請(qǐng)重新輸入");
            }else{
                result = numberA / numberB;
            }
            
            case 'e':
            NSLog(@"退出");
            break;
            
        default:
            break;
    }

而客戶端方面的代碼 我們可以這么寫

/**
 *  四則運(yùn)算
 */
- (void)operation

{
    char a ;
    
    double numberA;
    NSLog(@"請(qǐng)輸入數(shù)字A");
    scanf("%lf",&numberA);
    double numberB;
    NSLog(@"請(qǐng)輸入數(shù)字B");
    scanf("%lf",&numberB);
    
    NSLog(@"加法請(qǐng)輸入a");
    NSLog(@"減法請(qǐng)輸入b");
    NSLog(@"乘法請(qǐng)輸入c");
    NSLog(@"除法請(qǐng)輸入d");
    NSLog(@"退出請(qǐng)輸入e");
    
    scanf("%c",&a);
    
    [self operationWithnumberA:numberA Withoperator:a WithnumberB:numberB];  
}

在我們得到需要的數(shù)值之后壕翩,調(diào)用運(yùn)算方法做判斷蛉迹,算出結(jié)果傅寡。

這樣寫就會(huì)比if的判斷清晰放妈,因?yàn)槲覀円呀?jīng)把業(yè)務(wù)邏輯和界面顯示的部分完全分離了北救,在任何需要用到的地方,我們就可以直接復(fù)制這段代碼芜抒,完成運(yùn)算珍策。

但是假如,我有一天的運(yùn)算需求不滿足于四則運(yùn)算宅倒,而是希望加上開根號(hào)或者平方的運(yùn)算方法攘宙,該怎么辦。難道我們還要回頭拐迁,去switch語句里再加判斷條件蹭劈,之后在界面上增加提示么?

之前的代碼线召,我們只用到了面向?qū)ο蟮娜齻€(gè)特性之一铺韧,就是封裝,而解決我上一段話提出的疑問缓淹,我們可以用到另外兩個(gè)特性哈打,多態(tài)和繼承來實(shí)現(xiàn)。

為了實(shí)現(xiàn)之前的要求讯壶,在不改動(dòng)其他代碼的情況下料仗,能夠增加更多的運(yùn)算方法,或者修改出問題的運(yùn)算方法伏蚊。那么我們首先先把四則運(yùn)算立轧,封裝成四個(gè)類,即為加法類丙挽、減法類肺孵、乘法類、除法類颜阐。


@implementation AddOperation
/**
 *   加法
 */
+ (double)addOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
    double result = 0;
    
    result = numberA + numberB ;
    
    NSLog(@"%f",result);

    return result;
}




@implementation SubOperation

/**
 *   減法
 */
+ (double)subOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
    double result = 0;
    
    result = numberA - numberB ;
    
     NSLog(@"%f",result);
    
    return result;
}


@implementation MulOperation

/**
 *   乘法
 */
+ (double)mulOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
    double result = 0;
    
    result = numberA * numberB ;
    
     NSLog(@"%f",result);
    
    return result;
}

@implementation DivOperation

/**
 *   除法
 */
+ (double)divOperationWithNumberA:(double)numberA WithNumberB:(double)numberB
{
    double result = 0;
    
    if (numberB == 0) {
        NSLog(@"除數(shù)不能為0 請(qǐng)重新輸入");
    }else{
        result = numberA / numberB;
    }
    
     NSLog(@"%f",result);
    
    return result;
}

這樣我們就已經(jīng)把四則運(yùn)算平窘,封裝成了四個(gè)類。因?yàn)橥祽械试梗也]有設(shè)計(jì)界面模型瑰艘,只是把結(jié)果輸出來,所以每段輸出結(jié)果的NSLog請(qǐng)不要介意肤舞。

接下來紫新,我們?cè)诤唵喂S的Operation類中,把調(diào)用這四個(gè)類的運(yùn)算方法實(shí)現(xiàn)李剖。


/**
 *  封裝了一個(gè)運(yùn)算方法
 *
 *  @param numberA  數(shù)字A
 *  @param operator 運(yùn)算符
 *  @param numberB  數(shù)字B
 */
+ (void)operationWithnumberA:(double )numberA Withoperator:(char)operator WithnumberB:(double )numberB
{
    
    switch (operator) {
        case 'a':
            [AddOperation addOperationWithNumberA:numberA WithNumberB:numberB];
            break;
            
        case 'b':
            [SubOperation subOperationWithNumberA:numberA WithNumberB:numberB];
            break;
            
        case 'c':
            [MulOperation mulOperationWithNumberA:numberA WithNumberB:numberB];
            break;
            
        case 'd':
            [DivOperation divOperationWithNumberA:numberA WithNumberB:numberB];
            break;
        case 'e':
            NSLog(@"退出");
            break;
            
        default:
            break;
    }  
}

以上就是在簡單工廠的類中芒率,調(diào)用四個(gè)運(yùn)算方法的類,來實(shí)現(xiàn)運(yùn)算篙顺,并且成功解耦合偶芍,有利于以后的維護(hù)和擴(kuò)展充择。客戶端方面的代碼也就非常簡單匪蟀。


/**
 *  四則運(yùn)算
 */
- (void)operation

{
    char a = 'a';
    
    double numberA = 10;
    
    double numberB = 20;
    
    
//    NSLog(@"加法請(qǐng)輸入a");
//    NSLog(@"減法請(qǐng)輸入b");
//    NSLog(@"乘法請(qǐng)輸入c");
//    NSLog(@"除法請(qǐng)輸入d");
//    NSLog(@"退出請(qǐng)輸入e");
    
    
    [Operation operationWithnumberA:numberA Withoperator:a WithnumberB:numberB];

}

客戶端的代碼還是偷懶椎麦,沒有設(shè)計(jì)UI部分,所以也直接把數(shù)據(jù)代入進(jìn)去了材彪,但是大體的思路就是這樣观挎。直接用面向?qū)ο蟮娜筇匦詠斫鉀Q問題,在設(shè)計(jì)代碼時(shí)段化,一定要本著可維護(hù)嘁捷、可復(fù)用、可擴(kuò)展显熏、靈活性好的設(shè)計(jì)思路來設(shè)計(jì)普气。尤其要注意,這里的可復(fù)用佃延,可不是可復(fù)制哦现诀。今天的學(xué)習(xí)筆記就寫到這里。

簡單工廠模式的Demo我已經(jīng)上傳到Github上履肃,如果覺得對(duì)您有幫助仔沿,請(qǐng)star我。

Operation Factory Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尺棋,一起剝皮案震驚了整個(gè)濱河市封锉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膘螟,老刑警劉巖成福,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荆残,居然都是意外死亡奴艾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門内斯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕴潦,“玉大人,你說我怎么就攤上這事俘闯√栋” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我聘惦,道長锦援,這世上最難降的妖魔是什么蝗碎? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任振诬,我火速辦了婚禮,結(jié)果婚禮上衍菱,老公的妹妹穿的比我還像新娘。我一直安慰自己肩豁,他們只是感情好脊串,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著清钥,像睡著了一般琼锋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祟昭,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天缕坎,我揣著相機(jī)與錄音,去河邊找鬼篡悟。 笑死谜叹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搬葬。 我是一名探鬼主播荷腊,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼急凰!你這毒婦竟也來了女仰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤抡锈,失蹤者是張志新(化名)和其女友劉穎疾忍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體床三,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡一罩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撇簿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擒抛。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖补疑,靈堂內(nèi)的尸體忽然破棺而出歧沪,到底是詐尸還是另有隱情,我是刑警寧澤莲组,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布诊胞,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏撵孤。R本人自食惡果不足惜迈着,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邪码。 院中可真熱鬧裕菠,春花似錦、人聲如沸闭专。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽影钉。三九已至画髓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間平委,已是汗流浹背奈虾。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廉赔,地道東北人肉微。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像蜡塌,于是被迫代替她去往敵國和親浪册。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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