大丈夫

记录下学习iOS的点点滴滴,无私分享

工厂模式

工厂模式是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注册的方式
  • 目前工厂采用单例,提供抽象支付实例方法采用类方法(对上面代码稍作修改即可)
  • 大部分支付逻辑都模块化处理,在调用支付实例时,此实例被所在页面控制器所持有,而不可作为局部实例来使用,为了防止银联实例进行代理操作时提前释放导致崩溃
阅读更多
版权声明:本文为博主学习心得所写文章,不设版权,欢迎转载。 https://blog.csdn.net/tearscf/article/details/49898445
个人分类: 设计模式学习
上一篇单例模式
下一篇工厂模式-工厂方法
想对作者说点什么? 我来说一句

GankouNoodles.java

2018年05月23日 256B 下载

没有更多推荐了,返回首页

关闭
关闭