工厂模式

  • 使用场景
  • 好处
  • 使用步骤
    • 抽象类使用工厂方法生成具体子类,抽象类定义所有相关子类的共有的共同行为
    • 各个具体工厂重载抽象父类工厂中定义的方法,各个子类拥有一组共同的行为,但实际实现不同
  • 持有者和从工厂得到的具体类之间没有耦合
  • 一个实际使用工厂模式的场景

使用场景

如果一组相关对象在运行时按不同的标准创建的不一样,此时使用者就需要知道全部的细节才能创建他们,如果情况增加,代码就会变得难以维护

好处

1 工厂方法在变更返回哪一种对象这一点上更灵活
2工厂方法模式让使用者要求工厂方法创建的对象拥有一组共同的行为,所以使用者结构中引入新的具体类并不需要修改使用者代码,因为返回的任何具体对象都跟使用者在用的以前的接口相同

总结起来就是便于扩展和维护

使用步骤

抽象类使用工厂方法生成具体子类,抽象类定义所有相关子类的共有的共同行为

如代码
父类

@interface VVProductDetailBottomBubbleContentView : UIView/**返回需要展示的view类型@param product 商品模型@return 类*/
+ (Class)contentClassWithProduct:(VVProductDetailModel *)product;
/**刷新倒计时@param timeStr 时间字符串*/
- (void)loadRemindTime:(NSString *)timeStr;
/**展示商品信息@param product 商品模型*/
- (void)loadWithProduct:(VVProductDetailModel *)product;
/**已提醒过@param hasSetRemind 是否提醒过*/
- (void)updateWithHasSet:(BOOL)hasSetRemind;@end@implementation VVProductDetailBottomBubbleContentView+ (Class)contentClassWithProduct:(VVProductDetailModel *)product
{Class contentClass;switch (product.detailType) {case VVProductDetailViewTypeSpike:{contentClass = [VVProductDetailBottomNextView class];break;}case VVProductDetailViewTypeFlashOnsale:case VVProductDetailViewTypeBlackFridayOnsale:{contentClass = [VVProductDetailBottomCountDownView class];break;}case VVProductDetailViewTypeUpComing:case VVProductDetailViewTypeBlackFridayUpcoming:case VVProductDetailViewTypeBlackFridaySpikeUpcoming:{contentClass = [VVProductDetailUpcomingBottomBubbleView class];break;}case VVProductDetailViewTypeNormal:case VVProductDetailViewTypeDailySelection:case VVProductDetailViewTyperRankingList:case VVProductDetailViewTypePromptActivity:default:{contentClass = [VVProductDetailBottomBubbleContentView class];break;}}return contentClass;
}- (void)loadRemindTime:(NSString *)timeStr
{///定义接口
}- (void)loadWithProduct:(VVProductDetailModel *)product
{///定义接口
}- (void)updateWithHasSet:(BOOL)hasSetRemind
{///定义接口
}

各个具体工厂重载抽象父类工厂中定义的方法,各个子类拥有一组共同的行为,但实际实现不同

各个子类

/**商详页底部倒计时view*/
@interface VVProductDetailBottomCountDownView : VVProductDetailBottomBubbleContentView- (void)updateBackgroundImg:(NSString *)imageName;@end@implementation VVProductDetailBottomCountDownView- (instancetype)initWithFrame:(CGRect)frame
{if (self = [super initWithFrame:frame]) {[self setupUI];[self setContraints];}return self;
}- (void)setupUI
{[self addSubview:self.countDownBackgroundButton];[self.countDownBackgroundButton addSubview:self.endInLabel];[self.countDownBackgroundButton addSubview:self.countDownView];
}#pragma mark - reload
- (void)loadRemindTime:(NSString *)time
{///重写父类的方法
}- (void)loadWithProduct:(VVProductDetailModel *)product
{///重写父类的方法
}- (void)updateBackgroundImg:(NSString *)imageName
{///重写父类的方法
}其他子类同上

持有者和从工厂得到的具体类之间没有耦合

    Class contentClass = [VVProductDetailBottomBubbleContentView contentClassWithProduct:self.productDetailVM.productModel];NSObject *bottomBubbleView = [[contentClass alloc] init];if (![bottomBubbleView isKindOfClass:[VVProductDetailBottomBubbleContentView class]]) {return;}self.bottomBubbleView = (VVProductDetailBottomBubbleContentView *)bottomBubbleView;

一个实际使用工厂模式的场景

如下图的情况就适合使用工厂模式,解耦,



工厂模式在iOS开发中的实际应用相关推荐

  1. iOS 开发中的 Flux 架构模式

    本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时 ...

  2. iOS开发中使用[[UIApplication sharedApplication] openURL:]加载其它应用

    iOS 应用程序之间(1) 在iOS开发中,经常需要调用其它App,如拨打电话.发送邮件等.UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的url参数的 ...

  3. iOS开发中各种关键字的区别

    1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...

  4. iOS开发中标签控制器的使用——UITabBarController

    iOS开发中标签控制器的使用--UITabBarController 一.引言 与导航控制器相类似,标签控制器也是用于管理视图控制器的一个UI控件,在其内部封装了一个标签栏,与导航不同的是,导航的管理 ...

  5. IOS开发中单例模式使用详解

    第一.基本概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问. 第二.在IOS中使用单例模式的情 ...

  6. iOS开发中的单元测试(三)——URLManager中的测试用例解析

    本文转载至 http://www.cocoachina.com/cms/plus/view.php?aid=8088   此前,我们在<iOS开发中的单元测试(一)&(二)>中介绍 ...

  7. 工厂模式在 Calendar 类中的应用

    在前面讲到工厂模式的时候,大部分工厂类都是以 Factory 作为后缀来命名,并且工厂类主要负责创建对象这样一件事情.但在实际的项目开发中,工厂类的设计更加灵活.那我们就来看下,工厂模式在 Java ...

  8. 如何深入理解 iOS 开发中的锁?

    摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...

  9. 理解:iOS开发中锁的实现原理

    摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...

最新文章

  1. ubuntu 运行python subprocess 出现/bin/sh: 1: source: not found 错误
  2. transferto遇到的问题java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp
  3. 【转发】未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。...
  4. Linux 设备驱动 ==== 字符驱动
  5. Linux下网络抓包工具(ngrep)
  6. 偶然在github开源项目中发现了.travis.yml这货
  7. java exception message_Java 如何摆脱Exception.getMessage()输出带类名
  8. 拥抱变化,面向Java17,Java8-18全系列特性详解
  9. 投资是一个非常专业的领域,亏钱容易赚钱难
  10. 02-走马灯 动画实现图片无缝展示
  11. 回归- Regression
  12. STM32学习记录0002-STM32初探
  13. 思科路由器重置密码并保存设置重置密码
  14. Spring boot快速开发Rest服务
  15. P4 安装bmv2 详细教程(更新中。。)
  16. 软硬件学习记录2——通道速率中比特率bps、Bps、波特率含义及换算
  17. svn在本地搭建服务器,自己可以访问,局域网的其他电脑不可以访问
  18. 【PF4J】PF4J入门指南
  19. 阿里云OSS 分块上传的代码整理
  20. GTC 2017现场直击:以人工智能的名义搞一场黑科技的盛会!

热门文章

  1. 深圳宝安周边公司出行团建户外一日游
  2. vue 安装不上,报错,解决办法如下
  3. 易基因:人类tRNA基因位点表现出与衰老相关的DNA高甲基化|研究文章
  4. web前端(html)
  5. 我犯的错和解决AnimationEvent 'NewEvent' has no receiver! Are you missing a component
  6. JAVA中extends与implements详解
  7. ERP系统常用SQL集锦
  8. bazel编译protobuf时 “ERROR: cc_toolchain does not have mandatory provider ‘ProtoInfo‘. “
  9. html中repeat的作用,repeat-y
  10. contiki学习笔记(一)