KRISKEE'S BLOG[GO]

Builder Pattern 创建者模式的学习初探

  创建者模式的使用,主要目的是提高代码的可维护性,如果需要对需求进行修改,不用重新修改方法和接口,根据参数或条件的不同处理。也就是对象的创建方法与初始化方式分离

  对CountryBuilder对象的初始化,使用带属性参数的方法进行初始化,如果需求要更改,需要再次添加一个location的属性,那就需要修改此方法,操作比较简单;如果某一天需要添加10几20个方法,再次修改方法就比较麻烦,而且方法也比较长。

 0 // Countrybuilder.h
1
#import <Foundation/Foundation.h> 2 3 @interface CountryBuilder : NSObject 4 5 // 属性 6 @property(nonatomic,strong)NSString *capital; 7 @property(nonatomic,strong)NSString *name; 8 @property(nonatomic,assign)double area; 9 @property(nonatomic,assign)NSInteger population; 10 11 // 带属性参数的初始化方法 12 - (instancetype)initWithName:(NSString *)name 13 capital:(NSString *)capital 14 area:(double)area 15 population:(NSInteger)population; 16 @end
// Countrybuilder.m
#import "CountryBuilder.h"

@implementation CountryBuilder

#pragma mark - 带属性参数列表的初始化方法
- (instancetype)initWithName:(NSString *)name
                     capital:(NSString *)capital
                        area:(double)area
                  population:(NSInteger)population{
    self = [super init];
    if(self){
        self.name = name;
        self.capital = capital;
        self.area = area;
        self.population = population;
    }
    return self;
}

@end

  此时,我们可以使用创建者模式,将对象的创建方法与属性设置分离开。这有点类似于我们先创建对象再使用set方法设置属性。但不同的是,创建者模式更加紧凑:

 0 // CountryBuilder.h
1
#import <Foundation/Foundation.h> 2 3 @interface CountryBuilder : NSObject 4 5 typedef void(^CountryBlock)(CountryBuilder* country); 6 7 // 属性 8 @property(nonatomic,strong)NSString *capital; 9 @property(nonatomic,strong)NSString *name; 10 @property(nonatomic,assign)double area; 11 @property(nonatomic,assign)NSInteger population; 12 @property(nonatomic,strong)NSString *location; 13 14 // 使用创建者的初始化方法 15 + (instancetype)createWithBuilder:(CountryBlock)builder; 16 17 @end
 0 // CouontryBuilder.m
1
#import "CountryBuilder.h" 2 3 @implementation CountryBuilder 4 5 #pragma mark - 使用创建者模式初始化方法 6 + (instancetype)createWithBuilder:(CountryBlock)builder{ 7 CountryBuilder *country = [[CountryBuilder alloc] init]; 8 if(builder == nil){} 9 else{ 10 builder(country); 11 // 如果某些属性不能为空,则可以在此声明 12 NSAssert(country.name, @"Country name is required."); 13 } 14 return country; 15 } 16 17 @end

  在iOS 9中,创建消息弹框类UIAlertController中,对于对象的textField的设置也是使用了创建者方法进行构建:

1 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Title" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
2 [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
3     textField.backgroundColor = [UIColor yellowColor];
4     textField.placeholder = @"Please input name";
5 }];

 

posted @ 2016-03-29 14:30  Kriskee  阅读(198)  评论(0编辑  收藏  举报