7.Builder Pattern的学习和使用

1.面临的问题:

       我们通常在初始化一个对象时,需要给该对象的一些属性进行赋值,比如下面这个类:

typedef enum
{
    sexTypeMale,
    sexTypeFamle
} sexType;

@interface CYLPerson : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) sexType sex;

       当我们要给person对象的属性赋值时,一种方法是提供一个init方法,在这个init方法中约束需要被赋值的属性:  

-(instancetype)initWithName:(NSString *)name age:(int)age andSex:(sexType)sex
{
    self = [super init];
    if (self)
    {
        _name = name;
        _age = age;
        _sex = sex;
    }
    return self;
}
      这样的好处是可以约束使用者必须赋值所有需要赋值的属性,坏处是代码没有很好的可扩展性,当该类有一个新的属性增加时,又必须新声明一个方法,这样太麻烦。

      另一种方法是,直接alloc,init之后,然后对属性成员一一赋值,这样虽然可扩展,但是无法约束使用者对必须赋值的属性进行赋值。

      基于以上两种方法的缺点,我们就可以使用 Builder Pattern 来解决上面的问题:

2.Build Pattern

      先来看看利用Builder Pattern 是如何进行初始化的:

CYLPerson *person = [CYLPerson creatWithBuilder:^(CYLPersonBuilder *builder) {
        builder.name = @"张三";
        builder.age = 78;
        builder.sex = sexTypeFamle;
    }];
    NSLog(@"%@",person.name);
     这里我们引入了另外一个类:CYLPersonBuilder,利用该类来进行属性赋值,并在该类中检查需要被赋值的属性是否全部被初始化了。下面是这个类方法的代码:

typedef void (^BuilderBlock)(CYLPersonBuilder *);

+(instancetype)creatWithBuilder:(BuilderBlock)block;

+(instancetype)creatWithBuilder:(BuilderBlock)block
{
    CYLPersonBuilder *builder = [[CYLPersonBuilder alloc]init];
    block(builder);
    return [builder build];
}

     build方法的代码如下:

-(CYLPerson *)build
{
    NSAssert(_name, @"name属性未进行初始化");
    NSAssert(_age, @"age属性未进行初始化");
    NSAssert(_sex, @"sex属性未进行初始化");
    
    CYLPerson *person = [[CYLPerson alloc]init];
    person.name = _name;
    person.age = _age;
    person.sex = _sex;

    return person;
}

       这样我们在build方法中检查了需要约束的属性,并且增强了代码的可扩展性。

       以上便是关于Builder Pattern的学习。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值