工厂模式算是开发中比较常见的设计模式,简单工厂模式,工厂模式和抽象工厂模式,都属于工厂模式。单工厂模式(simple factory)是类的创建模式,静态工厂方法(static factory method)模式,简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。简单工厂模式会包含过多的判断条件,维护起来不是特别方便,工厂模式是主要通过依赖倒置将类的实例化推迟到子类中,实现动态扩展。抽象工厂模式是一个对象产品家族,根据需求提供不同的对象。

简单工厂模式

之前的文章中写过一篇简单工厂模式,假设我们我有一个服装加工工厂,可以根据不同的需求生产不同的服饰,定义一个服装基类和工厂类:

  1. @protocol DressProtocol <NSObject>
  2.  
  3. @optional
  4. -(void)provideMaterial;
  5.  
  6. @optional
  7. -(void)product;
  8.  
  9. @end
  10.  
  11. @interface Dress : NSObject<DressProtocol>
  12.  
  13. @end

服装Dress子类ForeignDress:

  1. @implementation ForeignDress
  2.  
  3. -(void)provideMaterial{
  4. NSLog(@"ForeignDress--准备原材料");
  5. }
  6.  
  7. -(void)product{
  8. NSLog(@"ForeignDress--生产");
  9. }
  10.  
  11. @end

ChinaDress子类:

  1. @implementation ChinaDress
  2.  
  3. -(void)provideMaterial{
  4. NSLog(@"ChinaDress---准备原材料");
  5. }
  6.  
  7. -(void)product{
  8. NSLog(@"ChinaDress---生产");
  9. }
  10.  
  11. @end

工厂类Manufactor:

  1. @protocol ManufactorProtocol <NSObject>
  2.  
  3. @optional
  4. -(Dress *)createDress:(NSString *)type;
  5.  
  6. @end
  7.  
  8. @interface Manufactor : NSObject<ManufactorProtocol>
  9.  
  10. -(void)start:(NSString *)type;
  11.  
  12. -(void)simpleStart:(NSString *)type;
  13.  
  14. -(void)startByCondition:(NSString *)type;
  15.  
  16. @end

方法实现:

  1. -(void)start:(NSString *)type{
  2. if ([type isEqualToString:@"Foreign"]) {
  3. dress=[[ForeignDress alloc]init];
  4. }else if([type isEqualToString:@"China"]){
  5. dress=[[ChinaDress alloc]init];
  6. }
  7. [dress provideMaterial];
  8. [dress product];
  9. }
  10. //博客园-FlyElephant 简单工厂
  11. -(void)simpleStart:(NSString *)type{
  12. dress=[ManuFactory dressInstance:type];
  13. [dress provideMaterial];
  14. [dress product];
  15. }

方法调用:

  1. Manufactor *factor=[[Manufactor alloc]init];
  2. [factor start:@"Foreign"];
  3. [factor simpleStart:@"China"];
  4. NSLog(@"博客园-FlyElephant");
  5. NSLog(@"http://www.cnblogs.com/xiaofeixiang/");

测试效果:

第一种我们在工厂中直接通过type类型判断,不同的类型生产不同的服装,但是如果type类型过多而且type实现的不一定的Dress服装类,所以放在Manufactor不合适,我们将其实现单独放在一个简单工厂里面。 你会发现,每次不同的类型我们都要去修改简单工厂,牵一发而动,不符合设计模式的"对扩展开放,对修改关闭"的原则,工厂模式可以解决简单工厂无法解决的问题。

工厂模式

假设公司效益比较好,工厂需要新增北京分厂,上海分厂的时候,这是时候通过简单工厂无法解决类扩展的问题,简单工厂之所以简单就是在于在同一个地方进行对象处理,工厂方法模式(Factory Method Pattern)工在基类中建立一个抽象方法,子类可以通过改写这一方法来改变创建对象的具体过程。工厂方法模式让子类来决定如何创建对象,来达到封装的目的。
 假设我们新增了北京分厂,属于北京分厂的服装可以直接调用北京工厂来完成:
  1. @implementation BJManufactor
  2.  
  3. -(Dress *)createDress:(NSString *)type{
  4. Dress *dress;
  5. if ([type isEqualToString:@"BJ"]) {
  6. dress=[[BJDress alloc]init];
  7. }else if([type isEqualToString:@"BJSpecial"]){
  8. dress=[[BJSpecialDress alloc]init];
  9. }
  10. return dress;
  11. }
  12.  
  13. @end
  1. Manufactor基类中的条件判断:
  1. -(void)startByCondition:(NSString *)type{
  2. Dress *myDress=[self createDress:type];
  3. [myDress provideMaterial];
  4. [myDress product];
  5. }

具体调用实现:

  1. Manufactor *bjfactor=[[BJManufactor alloc]init];
  2. [bjfactor startByCondition:@"BJ"];
  3. NSLog(@"博客园-FlyElephant");
  4. NSLog(@"http://www.cnblogs.com/xiaofeixiang/");

效果:

从对象的创建来讲,这个将对象的创建扩展到了对象子类,从设计原则中中的依赖角度来看,原来的工厂需要依赖的各种具体的服装子类的引用,现在将这些进行各种分类,这里是以工厂的形式进行分类,抽象组件不依赖于具体的实现组件,已经完成的扩展可以不需要变化,如果有新增需求只需要增加新的功能接口,高层组件不需要太大的变化。

抽象工厂模式

抽象工厂模式提供一个接口,用于创建一个对象家族,而无需指定具体类。工厂方法只涉及到创建一个对象的情况,有时我们需要一族对象,上面我针对的对象是工厂,当我们需要工厂提供提供不同的原料,需要的不同的启动资金和人数,才能成立一个真正的工厂,将每个工厂都聚合在一起形成统一的接口,这样我们可以称之为

抽象工厂基类,这里只提供实现了Cloth:

  1. @protocol AbstractFactory <NSObject>
  2.  
  3. @optional
  4. -(Cloth *)provideCloth;
  5.  
  6. @end
  7.  
  8. @interface AbstractFactory : NSObject<AbstractFactory>
  9.  
  10. @end

抽象工厂子类BJAbstractFactory:

  1. @implementation BJAbstractFactory
  2.  
  3. -(Cloth *)provideCloth{
  4. return [[Cloth alloc] init];
  5. }
  6.  
  7. @end

Cloth类:

  1. @implementation Cloth
  2.  
  3. -(void)clothMethod{
  4. NSLog(@"Cloth--Cloth");
  5. }
  6.  
  7. @end

Manufactor类中添加两个新的方法:

  1. -(void)configFactory:(AbstractFactory *)factory{
  2. abstractFactory=factory;
  3. }
  4.  
  5. -(void)startWithFactory:(NSString *)type{
  6. Dress *myDress=[self createDress:type];
  7. cloth=[abstractFactory provideCloth];
  8. [cloth clothMethod];
  9. [myDress provideMaterial];
  10. [myDress product];
  11. }

 方法调用:

  1. Manufactor *factor=[[BJManufactor alloc]init];
  2. [factor configFactory:[[BJAbstractFactory alloc] init]];
  3. [factor startWithFactory:@"BJ"];
  4. NSLog(@"博客园-FlyElephant");
  5. NSLog(@"http://www.cnblogs.com/xiaofeixiang/");

 效果:

从实现逻辑来看抽象工厂模式和工厂模式和类似,抽象工厂模式的重点在于创建抽象接口来创建一组相关的产品。抽象工厂模式中,抽象工厂定义接口,所有的具体工厂必须实现该接口,该接口包含一组方法用来生产产品。每个具体工厂能够生产一整组的产品。工程实践中根据实际情况进行择优选择~

iOS开发-工厂模式的更多相关文章

  1. iOS开发——工厂模式

    工厂模式很好用,为表诚意,我直接搞个实用的例子放这,解析一个订单的数据,并且这个订单里面可能不止一件商品的做法. 还是直接上代码,不懂的地方,再提出来. 1.在MyOrderDeals.h文件中 #i ...

  2. iOS 抽象工厂模式

    iOS 抽象工厂模式 什么是抽象工厂模式 简单了解一下 按照惯例,我们先了解一下什么是抽象工厂模式.抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种 ...

  3. iOS 简单工厂模式

    iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...

  4. iOS开发-代理模式

    代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...

  5. iOS开发-策略模式

    策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...

  6. iOS开发-模板方法模式

    模板方法模式定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤.模板方法模式是由子类决定实现算法中的步骤,工厂方法由子类决定实现哪一 ...

  7. iOS开发-命令模式

    命令模式算是设计模式中比较简单的,最常见的例子是工作任务安排下来进行编程,如果工作任务不需要完成,我们可以取消我们之前完成的代码,也可以理解为回滚撤销操作.这里面涉及到命令模式中的两个对象,一个是动作 ...

  8. iOS开发-状态模式

    状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...

  9. iOS开发-迭代器模式

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示.开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望 ...

随机推荐

  1. poj2114 树分治(点分治)

    poj1741板子套一套,统计对数的方式改一下,可以在O(n)时间内统计对数 最后不要忘记输出最后的“.” /* 给定一棵边权树,是否存在一条路径使得其长度为恰好为x 把1741的板子改为求点对之间的 ...

  2. GItlab作CI/CD时,想快点,有啥招?

    如果希望.m2文件有存缓,或是不要每次从dockerhub上找镜像(有的是本地镜像,远程没有的) 那么,gitlab-runner的config.toml初步优化文件如下: concurrent = ...

  3. python学习之基础语法

    一.缩进 学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断.python 最具特色的就是用缩进来写模块. 缩进的空白数量是可变的, ...

  4. Codeforces 757 C Felicity is Coming!

    题目大意:有n个训练营,m种宠物,每个训练营里里面有gi 个宠物,现在每只宠物都要完成一次进化,种类 相同的宠物进化之后,种类还是相同,种类不同的宠物不能进化成相同种类,且要求所有宠物进化之后,每个 ...

  5. 064 UDF

    一:UDF 1.自定义UDF 二:UDAF 2.UDAF 3.介绍AbstractGenericUDAFResolver 4.介绍GenericUDAFEvaluator 5.程序 package o ...

  6. Mac电脑如何设置DHCP

    通过设置MAC电脑的DHCP服务器可以为局域网内的其它设备自动分配IP地址,还能把物理地址和IP地址绑定起来,限制IP地址的获取.   OS X 10.11或以上版本已内置DHCP服务器软件,即boo ...

  7. hdu 2036 求多边形面积 (凸、凹多边形)

    <题目链接> Problem Description “ 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)” 话说部分学生心态极好,每天就知道游戏,这次考 ...

  8. JAVA Socket通信 打造属于自己的网盘

    近一个月没敲JAVA代码了,最近老师布置了一个写JAVA网盘的作业,总共花了十几个小时,总算写完了,debug真的累,感觉自己还是菜了,没有那种有一个想法就能马上用代码实现的能力....不扯了,下面开 ...

  9. Win 10 启用 Net3.5

    dism.exe /online /enable-feature /featurename:NetFX3 /Source:H:\sources\sxs

  10. BZOJ 4805: 欧拉函数求和 杜教筛

    https://www.lydsy.com/JudgeOnline/problem.php?id=4805 给出一个数字N,求sigma(phi(i)),1<=i<=N https://b ...