美文网首页
Objective-C生成器模式

Objective-C生成器模式

作者: 杭州凤梨 | 来源:发表于2017-04-22 19:58 被阅读0次

假如有以下实体类

实体类声明(.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...

通常可以有以下创建方法:

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

这种方法的缺点是时间久了会记不住这个类到底有哪些property需要在创建时初始化,尤其是这个类是有他人提供时,如果没有注释将会变得十分痛苦😳。

方法2:

类创建者在实体类中添加多个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;
...

这种创建方法清晰地告诉调用者到底有哪些property需要在创建时初始化。但是,当类的提供者有一天告诉你他增加了一个属性,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;
    }];

相关文章

  • Objective-C生成器模式

    假如有以下实体类 实体类声明(.h) 通常可以有以下创建方法: 方法1: 这种方法的缺点是时间久了会记不住这个类到...

  • 生成器模式(Builder Pattern)

    生成器模式:用生成器模式封装一个产品的构造过程,并允许按步骤构造 生成器模式又称为建造者模式,是创建性模式中的一种...

  • 设计模式--生成器(建造者)

    生成器模式(Builder) 生成器模式最初的定义出现于《设计模式》(Addison-Wesley,1994) 生...

  • Objective-C类族和工厂模式

    Objective-C类族和工厂模式 Objective-C类族和工厂模式

  • 建立iOS专属文档之Objective-C API文档生成器

    appledoc Objective-C API文档生成器 参考文 iOS使用appledoc 生成技术API文档...

  • 生成器模式(Builder Pattern)

    1.生成器模式概念 在《Head First Design Patterns》文中是这么介绍生成器模式的,“封装一...

  • 生成器模式

    生成器模式是iOS设计模式中比较简单的一种模式,也经常拿来和抽象工厂作对比。首先我们说下什么事生成器模式。该模式由...

  • iOS设计模式-生成器模式

    何为生成器模式? 生成器模式:将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。 生成器模...

  • 创建型模式4-生成器模式

    创建型模式4-生成器模式 生成器模式(builder) 意图 将一个复杂对象的构建与它的的表示分离,使得同样的构建...

  • S2. 生成器模式

    生成器模式 生成器模式属于创建型设计模式,根据需要分步创建功能较多的对象。 场景 问题 假设要生产两款不同品牌的笔...

网友评论

      本文标题:Objective-C生成器模式

      本文链接:https://www.haomeiwen.com/subject/tagszttx.html