Objective-C生成器模式

假如有以下實(shí)體類

實(shí)體類聲明(.h)
@interface ZDWCar : NSObject

@property (nonatomic, copy) NSString *brand;
@property (nonatomic, copy) NSString *country;
@property (nonatomic, strong) UIColor *color;
@property (nonatomic, assign) CGFloat price;
此處省略n多property...

通??梢杂幸韵聞?chuàng)建方法:

方法1:
ZDWCar *myCar = [[ZDWCar alloc] init];
    myCar.brand = @"wzd";
    myCar.country = @"China";
    myCar.color = [UIColor redColor];
    myCar.price = 111000;
    其它property賦值...

這種方法的缺點(diǎn)是時(shí)間久了會(huì)記不住這個(gè)類到底有哪些property需要在創(chuàng)建時(shí)初始化,尤其是這個(gè)類是有他人提供時(shí),如果沒有注釋將會(huì)變得十分痛苦??。

方法2:

類創(chuàng)建者在實(shí)體類中添加多個(gè)init方法,比如:

- (instancetype)initWithBrand:(NSString *)brand;
- (instancetype)initWithBrand:(NSString *)brand country:(NSString *)country;
- (instancetype)initWithBrand:(NSString *)brand country:(NSString *)country color:(UIColor *)color;
- (instancetype)initWithBrand:(NSString *)brand country:(NSString *)country color:(UIColor *)color price:(CGFloat)price;
...

這種創(chuàng)建方法清晰地告訴調(diào)用者到底有哪些property需要在創(chuàng)建時(shí)初始化。但是,當(dāng)類的提供者有一天告訴你他增加了一個(gè)屬性,init方法也變了。這時(shí),你是不是想死?還有如果當(dāng)需要初始化的property比較多時(shí),一排排的init豈不是很壯觀???

當(dāng)某實(shí)體類的屬性值很多時(shí),特別是當(dāng)類將來是要提供給其他人用時(shí),可以使用生成器模式:

在聲明文件(.h)中添加

typedef void(^ZDWCarBulderBlock)(ZDWCarBuilder *builder);


+(instancetype)createWithBuilder:(ZDWCarBulderBlock)block;

在定義(.m)文件中添加

+(instancetype)createWithBuilder:(ZDWCarBulderBlock)block {
    NSParameterAssert(block);
    ZDWCarBuilder *builder = [[ZDWCarBuilder alloc] init];
    block(builder);
    return [builder build];
}
生成器類聲明(.h)
@interface ZDWCarBuilder : NSObject

@property (nonatomic, copy) NSString *brand;
@property (nonatomic, copy) NSString *country;
@property (nonatomic, strong) UIColor *color;
@property (nonatomic, assign) CGFloat price;

- (ZDWCar *)build;
生成器類定義(.m)
- (ZDWCar *)build {
    //設(shè)置brand和country為必須初始化的屬性,不傳會(huì)整段垮掉,??
    NSParameterAssert(self.brand);
    NSParameterAssert(self.country);
    
    ZDWCar *car = [[ZDWCar alloc] init];
    car.brand = self.brand;
    car.country = self.country;
    car.color = self.color;
    car.price = self.price;
    return car;
}

調(diào)用方實(shí)例

ZDWCar *myCar = [ZDWCar createWithBuilder:^(ZDWCarBuilder *builder) {
        builder.brand = @"wzd";
        builder.country = @"China";
        builder.color = [UIColor redColor];
        builder.price = 111000;
    }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容