iOS开发中的工厂模式以及应用

工厂模式就是根据不同的需求生产不同的产品,实质就是一个工厂类根据传入的参数动态决定应该创建哪一个产品类的实例。 

想象一个场景:

一个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

本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,023评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,902评论 1 32
  • 1.工厂模式 工厂模式通常被分为简单工厂和抽象工厂,我就不区分了,这里举几个在开发中使用工厂方法的例子。 1.系统...
    8fe8946fa366阅读 4,590评论 1 0
  • 整个城市闷得像个蒸笼,乌云黑压压地罩着。 一丝丝风都没有,空气潮得能拧出水来。 出去转一圈,浑身都是细细密密的汗...
    泛泛泛否阅读 1,418评论 0 0
  •   在编写代码时,经常需要调用别人已经写好的工具类方法,而这些方法经常又是使用静态方法实现的。而我们在测试自己的代...
    SeanPenn阅读 22,997评论 0 2

友情链接更多精彩内容