关闭

工厂模式

标签: 工厂模式设计模式ios
283人阅读 评论(0) 收藏 举报
分类:

工厂模式是iOS开发中最常用的模式,以下讲的是最简单实现的一种工厂模式,当然还有很多变种工厂模式,后续再上,最近学习设计模式后有所心得。
工厂模式

需求

  • 现在需要集成支付第三方,有支付宝,微信,palpay,银联等。
  • 只通过一个方法来获取具体支付实例,且生成逻辑是不变的
  • 具体支付实例被当作抽象支付类使用,即不关心具体支付类,能与具体支付类解耦合
  • 当增减第三方支付时,应用端的代码无需多少变动

定义

工厂模式是通过工厂提供抽象产品实例而非直接对具体产品实例化。

这里写图片描述

这就是带参数的工厂模式。
缺点就是增减产品时,工厂类需要修改,违反了类的open-close原则。但是相比只通过一个单例传参并获取对应支付方法来说,更模块化,更易维护。

若想增减产品但又不修改工厂类方法,可以采用注册类的方式,有点像tableview注册cell的类方法,这样相应的把工厂生成产品的方法逻辑修改一下即可。

-(PTXProduct*)createProductWithParamId:(NSString *)paramId
{
    NSString *className = [registedDict valueForKey:param];
    if (!className) {
        return nil;
    }
   Class productClass = NSClassFromString(className);
    return [[productClass alloc] init];
}

-(void)registerParamId:(NSString *)paramId productClass:(Class)productClass
{
    if (!registedDict) {
        registedDict = [NSMutableDictionary dictionary];
    }
    [registedDict setValue:NSStringFromClass(productClass) forKey:paramId];
}

项目问题归结

  • 由于第三方支付系统存在注册分歧,只有微信SDK需要注册且分享与支付共用一个注册代理,其他支付宝和银联无此需要。目前集成过程中预留了抽象支付类注册方法,但是仍然采用外部appDelegate注册的方式
  • 目前工厂采用单例,提供抽象支付实例方法采用类方法(对上面代码稍作修改即可)
  • 大部分支付逻辑都模块化处理,在调用支付实例时,此实例被所在页面控制器所持有,而不可作为局部实例来使用,为了防止银联实例进行代理操作时提前释放导致崩溃
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8188次
    • 积分:228
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:8篇
    • 译文:1篇
    • 评论:1条
    最新评论