iOS中的工厂模式
2016-03-24 本文已影响5135人
wu2016
iOS中工厂模式我的理解是:利用OC语言的特性“多态”来创建不同的对象
如果后台提供的一个接口中有两至三种不同的数据,比如说有些是新闻,有些是图片,有些是音乐,那么该如非常方便的去使用这些数据在页面上展示出来呢?
在这里举个简单的例子:
先创建一个BaseModel,然后再News,Music,Images继承于BaseModel,然后在BaseModel中写一个便利构造器:
//创建一个便利构造器
+ (instancetype)initWithDictionary:(NSDictionary *)dictionary;
// 根据字典内提供的数据分别创建出对应的model来获取数据
+ (instancetype)initWithDictionary:(NSDictionary *)dictionary
{
// 先使用当前类(父类)创建出model对象
BaseModel *model = nil;
// 根据字典中key对应的数据初始化不同的子类对象并将其返回给我们的父类
if ([dictionary[@"tag"] isEqualToString:@"news"]) {
model = [[News alloc] init];
} else if ([dictionary[@"tag"] isEqualToString:@"images"]){
model = [[Images alloc] init];
} else if([dictionary[@"tag"] isEqualToString:@"music"]){
model = [[Music alloc] init];
}
[model setValuesForKeysWithDictionary:dictionary];
return model;
}
这里直接使用plist文件写一些死数据来展示,那么在tableView中的展示数组该如何获取值呢?
- (NSMutableArray *)dataArray
{
if(!_dataArray)
{
_dataArray = [NSMutableArray array];
NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
NSArray *arr = [NSArray arrayWithContentsOfFile:path];
for (NSDictionary *dic in arr) {
BaseModel *model = [BaseModel initWithDictionary:dic];
// 将不同子类创建出的model对象添加到我们的数组当中
[_dataArray addObject:model];
}
}
return _dataArray;
}
这样数组dataArray中存的就是我们想要的三种不同的对象。再去展示到页面上就可以了。
当然在展示到Cell上的时候,不同的Model对象需要的Cell也是不同的,所以Cell的创建也是可以通过工厂模工进行创建的,这里就不详细介绍了,下面链接中有这样的一个例子,有兴趣的可以下载下来看看。
Demo地址在这里,如果感觉没看懂可以去看看。以上都是我个人理解,如果有不对的地方请大牛们指正