iOS 的三种工厂模式

1. 前言

定义

工厂模式可以简单概括为同类型不同型号的产品有各自对应的工厂进行生产。好比如iPhone手机旗下有iPhoneX及iPhone8两种型号的手机,iPhoneX有自己iPhoneX的专属工厂进行生产,而iPhone8有自己iPhone8的专属工厂进行生产。两条生产线没有交集互不影响,后期如果新增或废弃相关类型的产品也不会影响到原有的生产线。

名词解释

  • 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象。
  • 抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共同拥有的接口。可是抽象类或接口。
  • 具体产品(ConcreteProduct)对象:工厂模式所创建的对象都是这个角色的实例。

三种模式

  • 简单工厂模式:简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
  • 工厂模式:抽象了工厂接口的具体产品,应用程序的调用不同工厂创建不同产品对象。(抽象产品
  • 抽象工厂模式:在工厂模式的基础上抽象了工厂,应用程序调用抽象的工厂发发创建不同产品对象。(抽象产品+抽象工厂

2.代码实现

  • 简单工厂模式
SFOperation *sfOperation = [SFFactory operationBreakfast:SFFactoryProductTypeMantou];//只有一个简单的工厂去生产产品。不好扩展产品
[sfOperation productBreakfast];//产品自身的逻辑
NSLog(@"生产产品:%@",sfOperation.product);
  • 工厂模式
//馒头
FFOperation *ffOperation = [FFactoryMantou createOperation];//不同工厂生产不同产品
[ffOperation productBreakfast];
NSLog(@"生产产品:%@",ffOperation.product);

//油条
FFOperation *ffOperation = [FFactoryMantou createOperation];//不同工厂生产不同产品
[ffOperation productBreakfast];
NSLog(@"生产产品:%@",ffOperation.product);
  • 抽象工厂模式
AFFactory *afFactory = [AFFactory factoryWithType:AFFactoryProductTypeMantou];//抽象工厂 直接生产不同产品
AFOperation *afOperation = [afFactory createProduct];
[afOperation productBreakfast];
NSLog(@"生产产品;%@",afOperation.product);


3.总结

  • 优点:客户端调用简单明了,不需要关注太多的逻辑。
    缺点:也正是所谓的优点,导致了工厂类中揉杂了太多的业务逻辑,产品类本身是符合开闭原则的,对扩展开放对修改关闭,但是工厂类却违反了开闭原则,因为每增加一个产品,工厂类都需要进行逻辑修改和判断,导致耦合度太高

  • 所以工厂模式相对简单工厂模式的优点显而易见,如果业务逻辑很简单可以选择简单工厂模式,如果业务逻辑复杂还是选择工厂模式好。

  • 不过个人觉得抽象模式还是比较复杂的,而且扩展扩展起来也不是很灵活,如果产品族非常多的话会生成很多产品类出来,是一件恐怖的事情。所以有人结合简单工厂模式和工厂模式,利用反射(java)机制对抽象工厂模式进行优化,避免生成太多的产品类。感兴趣的同学可以看看这篇文章

从简单工厂模式到工厂模式,再到抽象工厂模式。可以看到整个模式的一步步演进。简单工厂模式在产品多样之后,整个工厂将会变得臃肿而难以维护。于是我们将简单工厂模式中的工程做了抽象处理,这样每种产品对应一个工厂。这样无疑会增加代码量。但是好处是显而易见的,单独让一个工厂处理一种产品会让逻辑变得好维护。但是这样还不够,因为增加新的品类,就会产生新的类,对于调用者来说,处理太多具有相同接口的类显然是不合算的。于是,我们使用抽象工厂模式来解决这个问题。我们让抽象工厂内部做一个封装,用以隐藏真正的具体工厂。这样,对于调用者来说,即时内部增加了新的产品,你也是不知道的。


相关参考:
https://www.jianshu.com/p/847af218b1f0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 1,341评论 0 7
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,993评论 1 15
  • 说明:在我理解中,这里所谓的抽象,其实就是制定某一个接口规范。具体体现在代码里,就是设置一个基类,基类遵守某一套接...
    酱油不爱醋阅读 19,171评论 16 97
  • 在当前 PHP 版本的默认配置下,“输出缓冲(Output Buffering)”是被打开的。旧版本则不是这样,在...
    程序员祝融阅读 366评论 0 1
  • 从小到大,我的脑海里总是有很多很多奇思妙想,有时候我幻想自己是王子,地位尊贵,身披荣光,正走向属于我的睡美人,等待...
    李琼玖阅读 372评论 10 4