用OC程式碼認識設計模式(一) 建立型模式

韋家冰發表於2017-12-13

參考: iOS設計模式四部曲(一):建立型模式 內附Demo 大話設計模式之oc實現23種模式 風中獨思--設計模式 <簡書 — 劉小壯> http://www.jianshu.com/p/750b82fa6a62

用OC程式碼認識設計模式(一)  建立型模式

用OC程式碼認識設計模式(一)--建立型模式 用OC程式碼認識設計模式(二)--結構型模式 用OC程式碼認識設計模式(三)--行為型模式 用OC程式碼認識六大設計原則 MVC、MVP、MVVM

####建立型模式 #####1、原型模式(Prototype) 定義:原型模式就是允許你建立現有物件的副本並根據需要進行修改,而不是從頭開始建立物件並進行設定。 理解:一句程式碼複製一個物件

OC程式碼:copy、mutableCopy

NSArray *array = [[NSArray alloc] initWithObjects:@1, nil];
NSArray *array2 = array.copy;
複製程式碼

#####2、單例模式(Singleton) 定義:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 OC程式碼

+ (instancetype)sharedInstance {
    static id shareInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shareInstance = [[self alloc] init];
    });
    return shareInstance;
}
複製程式碼
3、工廠模式

######(1)簡單工廠,就是一個方法,判斷引數,new不同的子類

//CarFactory.m
+ (Car *)createCarWithType:(NSIntger)passengersCount {
    if (passengersCount < 2) {
        return [[SportCar alloc] init];
    } else if (passengersCount < 4) {
        return [[NormalCar alloc] init];
    } else {
        return [[SUV alloc] init];
    }
}
複製程式碼

######(2)工廠方法模式(FactoryMethod) 定義:讓子類決定例項化哪一個類。工廠方法使得類的例項化延遲到其子類。 OC程式碼

    //UILabel、UIButton 都是UIView
    UILabel *label = [UILabel new];
    UIButton *button = [UIButton new];
複製程式碼

######(3)抽象工廠模式(AbstractFactory) 定義:抽象工廠模式是工廠方式模式的升級版本

    // 繼承BaseFactory(抽象工廠),可以生產手機、生產電視
    
    LeshiFactory *leshiFactory = [LeshiFactory new];// 樂視工廠
    XiaoMiFactory *xiaomiFactory = [XiaoMiFactory new];// 小米工廠
    
    // 繼承PhoneProduct
    LeshiPhoneProduct *leshiPhone = [leshiFactory createPhone];// 樂視手機
    XiaoMiPhoneProduct *xialmiPhone = [xiaomiFactory createPhone];// 小米手機
    // 繼承TVProduct
    LeshiTVProduct *leshiTV = [leshiFactory createTV];// 樂視電視
    XiaoMiTVProduct *xialmiTV = [xiaomiFactory createTV];// 小米電視
複製程式碼

工廠模式.png

#####4、建立者模式(Builder) 定義:使用多個簡單的物件一步一步構建成一個複雜的物件。 將一個複雜物件的構建與它的表現分離,使得同樣的構建過程可以建立不同的表現。

組裝電腦例子

    // 組裝電腦
    Builder *builder = [Builder new];
    [builder setBuilderCpu:@"i7"];
    [builder setBuilderMainboard:@"Intel主機板"];
    [builder setBuilderRam:@"金士頓16G"];
    
    // 電腦產品
    Computer *computer = [builder computer];
複製程式碼

相關文章