工厂模式就是根据不同的需求生产不同的产品,实质就是一个工厂类根据传入的参数动态决定应该创建哪一个产品类的实例。
想象一个场景:
一个UITableView上cell上的内容有多种情况即一个UITableView有多种样式的cell,我们怎么去实现这个功能?
我在最初的时候会这样去实现这个功能:
1.每个cell对应一个数据(一般是字典),我需要后台在这个对应的数据上加一个字段以判断该cell是哪一种样式。
2.创建一个cell,一个与cell对应的模型。cell上会添加上所有的cell样式,模型上会包含cell对应的所有数据,然后根据模型的类型响应的显示cell上的内容。
(突然感觉这种方式也是不错的,只不过cell中的代码稍微多一些。这也属于工厂模式,根据不同的情况创建出不同样式的cell)
我们可以利用工厂模式去实现该功能。
1.我们创建一个基类cell和一个基类Model
2.我们创建多个继承自基类cell的子cell,创建多个继承自基类Model的Model
3.我们根据后台返回的数据的不同利用基类Model相应地创建多个子类Model
4.我们根据子类Model的不同利用基类cell相应地创建多个子类cell
代码:
创建不同的模型:
// 根据字典内提供的数据分别创建出对应的model来获取数据
+ (instancetype)initWithDictionary:(NSDictionary*)dictionary
{
// 先使用当前类(父类)创建出model对象
BaseModel*model =nil;
// 根据字典中key对应的数据初始化不同的子类对象并将其返回给我们的父类
if([dictionary[@"tag"]isEqualToString:@"news"]) {
model = [[Newsalloc]init];
}elseif([dictionary[@"tag"]isEqualToString:@"images"]){
model = [[Imagesalloc]init];
}elseif([dictionary[@"tag"]isEqualToString:@"music"]){
model = [[Musicalloc]init];
}
[modelsetValuesForKeysWithDictionary:dictionary]; // 字典快速赋值
returnmodel;
}
创建不同的cell:
+ (instancetype)initWithModel:(BaseModel*)model
{
//根据我们的OC函数获取我们的model类名并将其转化为OC字符串
NSString *modelName = [NSString stringWithUTF8String:object_getClassName(model)];
NSLog(@"modelName:===%@", modelName);
//使用model的类名拼接一个"Cell"来获取到我们的Cell类名
NSString *cellName = [modelName stringByAppendingString:@"Cell"];
//根据我们所提供的cellName来获取其对应的“cell子类”初始化一个cell对象返回给我们的父类对象
//唯一标识符可以使用我们所提供的model来给予不同cell所对应的标识来重用。
// 根据传过来的Model创建一个对应的具体的cell
BaseCell *cell = [[NSClassFromString(cellName) alloc]initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:modelName];
returncell;
}
demo地址:https://gitee.com/liangsenliangsen/factory_mode_demo.git
本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊
网友评论