iOS設(shè)計模式(2)工廠模式

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

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

承接上文

1.概念描述

工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統(tǒng)可以說是隨處可見。因為工廠模式就相當(dāng)于創(chuàng)建實例對象的new,我們經(jīng)常要根據(jù)類Class生成實例對象,如A a=new A() 工廠模式也是用來創(chuàng)建實例對象的,所以以后new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統(tǒng)帶來更大的可擴展性和盡量少的修改量。---百度百科

以上是百度百科對工廠模式的描述,大家參考一下。上一篇文章咱們看了工廠模式的一種特殊實現(xiàn):簡單工廠模式。文章中也提到了,簡單工廠類中揉雜了太多的業(yè)務(wù)邏輯,耦合度太高了。

制作牌子的公務(wù)員賴洋洋的抱怨:“什么牌子的都送我這來,想累死老子嗎?哪天老子一生氣把黃牌號制成藍牌號別怪我!” 天朝的公務(wù)員就是這樣牛逼,不過他說的也對。于是領(lǐng)導(dǎo)順?biāo)浦鄢脵C安排了某個親戚家的人來專門制作黃牌子,這樣兩個人分工明確了,也不會出現(xiàn)失誤了,一舉兩得。那代碼中咱們怎樣實現(xiàn)業(yè)務(wù)邏輯分離解耦呢?下面看代碼

2.代碼實現(xiàn)

我們要解決的糟糕代碼是這個地方

#import <Foundation/Foundation.h>

@class LHCarLicense;

typedef enum : NSUInteger {
    ELicenseType_Blue,
    ELicenseType_Yellow
} ELicenseType;

@interface LHCarLicenseFactory : NSObject

/**
 *  獲取牌照工廠
 *
 *  @param type 牌照類型
 *
 *  @return 返回牌照對象
 */
+ (LHCarLicense *)createCarLicenseWithType:(ELicenseType)type;

@end

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

@implementation LHCarLicenseFactory

+ (LHCarLicense *)createCarLicenseWithType:(ELicenseType)type{
    
    LHCarLicense *_license;
    
    switch (type) {
        case ELicenseType_Blue:
            _license = [[LHBlueCarLicense alloc] init];
            break;
            
        case ELicenseType_Yellow:
            _license = [[LHYellowCarLicense alloc] init];
            break;
    }
    
    return _license;
}

@end

那個該怎樣解耦呢,我們前面說了,工廠類中摻雜了業(yè)務(wù)邏輯,那就要把業(yè)務(wù)邏輯抽離,怎樣抽離?我們的思路的是實現(xiàn)一個基類工廠,然后再分別派生出藍牌工廠和黃牌工廠,然他們各自實現(xiàn)自己的業(yè)務(wù)邏輯,這樣相互之間業(yè)務(wù)變動不會影響彼此,擴展新的業(yè)務(wù)也不會影響到既有業(yè)務(wù),下面看具體代碼實現(xiàn):

定義基類工廠,將之前的工廠類修改為下面這樣:

#import <Foundation/Foundation.h>

@class LHCarLicense;

@interface LHCarLicenseFactory : NSObject

/**
 *  獲取牌照工廠
 *
 *  @param type 牌照類型
 *
 *  @return 返回牌照對象
 */
+ (LHCarLicense *)createCarLicense;

@end

#import "LHCarLicenseFactory.h"
#import "LHCarLicense.h"

@implementation LHCarLicenseFactory

+ (LHCarLicense *)createCarLicense{
    return nil;
}

@end

然后派生藍牌工廠類和黃牌工廠類

#import "LHCarLicenseFactory.h"

@interface LHBlueCarLicenseFactory : LHCarLicenseFactory

@end

#import "LHBlueCarLicenseFactory.h"
#import "LHBlueCarLicense.h"

@implementation LHBlueCarLicenseFactory

+ (LHCarLicense *)createCarLicense
{
    LHBlueCarLicense *_blueCarLicense = [[LHBlueCarLicense alloc] init];
    return _blueCarLicense;
}

@end

#import "LHCarLicenseFactory.h"

@interface LHYellowCarLicenseFactory : LHCarLicenseFactory

@end

#import "LHYellowCarLicenseFactory.h"
#import "LHYellowCarLicense.h"

@implementation LHYellowCarLicenseFactory

+ (LHCarLicense *)createCarLicense
{
    LHYellowCarLicense *_blueCarLicense = [[LHYellowCarLicense alloc] init];
    return _blueCarLicense;
}

@end

ok,這樣就把原來耦合的業(yè)務(wù)邏輯剝離出去了,這樣的代碼邏輯清晰,層面分明、擴展性也好。客戶端調(diào)用代碼只需做如下修改

#import "ViewController.h"
#import "LHCarLicense.h"
#import "LHCarLicenseFactory.h"
#import "LHBlueCarLicenseFactory.h"
#import "LHYellowCarLicenseFactory.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark -
#pragma mark Button Event

// 生成藍色牌照
- (IBAction)btnBlueEvent:(UIButton *)sender {
    LHCarLicense *_license = [LHBlueCarLicenseFactory createCarLicense];
    _license.city = _txtCity.text ? _txtCity.text : @"京";
    _lbLicenseNumber.text = [_license printLicenseNumber];

}

// 生成黃色牌照
- (IBAction)btnYellowEvent:(UIButton *)sender {
    LHCarLicense *_license = [LHYellowCarLicenseFactory createCarLicense];
    _license.city = _txtCity.text ? _txtCity.text : @"京";
    _lbLicenseNumber.text = [_license printLicenseNumber];
}

@end

輸出結(jié)果依然

WechatIMG1.jpeg

所以工廠模式相對簡單工廠模式的優(yōu)點顯而易見,如果業(yè)務(wù)邏輯很簡單可以選擇簡單工廠模式,如果業(yè)務(wù)邏輯復(fù)雜還是選擇工廠模式好。

源碼下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評論 25 708
  • 今天學(xué)習(xí)下最常見的工廠模式,工廠模式細分下來有三大類: 他們的目標(biāo)都是一樣的:封裝對象的創(chuàng)建。但是實現(xiàn)手段和使用場...
    西木柚子閱讀 2,179評論 7 28
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,842評論 2 17
  • 精最美的古代情詩(十首) 《君生我未生,我生君已老》 君生我未生,我生君已老。 君恨我生遲,我恨君生早。 君生我未...
    烏龜有殼閱讀 2,190評論 0 2
  • 總感覺 自己就是一只雄鷹 總感覺 振翅就能飛到山頂 總感覺 自己的故事會有人聽 那時候 我們年輕 總感覺 耳畔有你...
    East華閱讀 152評論 0 0