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的学习。