Objective-C生成器模式

假如有以下實體類

實體類聲明(.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賦值...

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

方法2:

類創(chuàng)建者在實體類中添加多個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)建方法清晰地告訴調用者到底有哪些property需要在創(chuàng)建時初始化瀑踢。但是,當類的提供者有一天告訴你他增加了一個屬性才避,init方法也變了橱夭。這時,你是不是想死桑逝?還有如果當需要初始化的property比較多時棘劣,一排排的init豈不是很壯觀???

當某實體類的屬性值很多時楞遏,特別是當類將來是要提供給其他人用時茬暇,可以使用生成器模式:

在聲明文件(.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 {
    //設置brand和country為必須初始化的屬性,不傳會整段垮掉,??
    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;
}

調用方實例

ZDWCar *myCar = [ZDWCar createWithBuilder:^(ZDWCarBuilder *builder) {
        builder.brand = @"wzd";
        builder.country = @"China";
        builder.color = [UIColor redColor];
        builder.price = 111000;
    }];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末寡喝,一起剝皮案震驚了整個濱河市糙俗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拘荡,老刑警劉巖臼节,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異珊皿,居然都是意外死亡网缝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門蟋定,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粉臊,“玉大人,你說我怎么就攤上這事驶兜《笾伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵抄淑,是天一觀的道長屠凶。 經(jīng)常有香客問我,道長肆资,這世上最難降的妖魔是什么矗愧? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮郑原,結果婚禮上唉韭,老公的妹妹穿的比我還像新娘夜涕。我一直安慰自己,他們只是感情好属愤,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布女器。 她就那樣靜靜地躺著,像睡著了一般住诸。 火紅的嫁衣襯著肌膚如雪驾胆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天贱呐,我揣著相機與錄音俏拱,去河邊找鬼。 笑死吼句,一個胖子當著我的面吹牛锅必,可吹牛的內容都是我干的。 我是一名探鬼主播惕艳,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼搞隐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了远搪?” 一聲冷哼從身側響起劣纲,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谁鳍,沒想到半個月后癞季,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡倘潜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年绷柒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涮因。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡废睦,死狀恐怖,靈堂內的尸體忽然破棺而出养泡,到底是詐尸還是另有隱情嗜湃,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布澜掩,位于F島的核電站购披,受9級特大地震影響,放射性物質發(fā)生泄漏肩榕。R本人自食惡果不足惜刚陡,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橘荠,春花似錦、人聲如沸郎逃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褒翰。三九已至贮懈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間优训,已是汗流浹背朵你。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揣非,地道東北人抡医。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像早敬,于是被迫代替她去往敵國和親忌傻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容