工厂设计模式

一、工厂模式:

定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。

二、分类:

简单工厂模式

工厂模式

抽象工厂模式

三、什么时候使用工厂设计模式

编译时无法确定预期要创建的对象类

类想让子类决定运行时创建什么

类有若干的辅助子类,而你想将返回那个子类这一信息局部化

简单工厂模式

例子1:

有这么一个需求,有UIWebView和WKWebView两种,通过简单工厂方法创建去实现加载url的需求.

创建工厂类HJWebViewFactory,制定协议,其中加载有加载URL的方法

HJWebViewFactory  .h文件代码,根据传入的类型去创建不同的对象。

HJWebViewFactory  .m文件代码

外部使用

从上面的介绍可以看出,简单工厂模式的优点是客户端可以直接消费产品,而不必关心具体产品的实现,消除了客户端直接创建产品对象的责任,实现了对责任的分割。

简单点说就是客户端调用简单明了,不需要关注太多的逻辑。

缺点是工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响,而且当产品类别多结构复杂的时候,把所有创建工作放进一个工厂来,会使后期程序的扩展较为困难。产品类本身是符合开闭原则的,对扩展开放对修改关闭,但是工厂类却违反了开闭原则,因为每增加一个产品,工厂类都需要进行逻辑修改和判断,导致耦合度太高。例如增加一个MiniWebview,在工厂类HJWebViewFactory就要新增加一个枚举WebViewStypeMiniWebView,揉杂了太多的业务逻辑,耦合度太高了

例子2:

有这么一个需求,加载一个UITableView,有3个Section,每个section有不同的cell,cell的高度和数量都不一样。咋些?

看到这样的代码,咋一看好有道理的样子。仔细琢磨一下,你个Low逼,作为一个资深的开发,写的是个啥?还写这么多?自此陷入了深深的思考和自责中。。。

加入我们新加一种cell进去,需要新注册一个cell,代理方法的判断就要重新改一遍,不利于扩展。

创建cell,挤成UITableViewCell,

优化之后的代码,不但减少了cell的头文件的引用,而且如果新增一种cell的时候,只需要修改下图中数据源的地方就可以了,然后在各自的cell里面写自己的代码就行了,其他的地方不用都不用动。

[tableView dequeueReusableCellWithIdentifier:[cellDict objectForKey:@"cellIdentifier"] forIndexPath:indexPath];方法即为一个工厂。该方法在调用时会执行各种样式Cell的工厂方法并返回一个具体产品。

这里体现出了工厂模式的美丽,父类提供了创建cell的接口,通过不同的reuseIdentifier让其子类实例化不同的cell,减少代码,解耦。当然这只是简单的优化,通过继承,协议,或者分类我们可以进一步优化代码,目的用最少的代码改动应对复杂多变的需求。

工厂模式

文件目录如下:

创建Factory工厂类,里面公开创建webView的方法,如下图:

分别创建HJMyUIWebViewFactory和HJMyWkWebViewFactory工厂,都继承Factory类


HJMyUIWebViewFactory和 HJMyWkWebViewFactory .m中分别实现创建webView的方法,如下图:

使用的方法如下:

工厂类(Factory)只定义了一个创建产品的抽象接口,创建具体产品的工作由具体的工厂(UIWebView工厂、WKWebView工厂)来实现。如果需要增加其他类型的比如MiniWebView,那么使用简单工厂模式实现的话,首先需要增加一个MiniWebView的类,然后修改工厂类(HJWebViewFactory),在里面加分支语句来判断;使用工厂方法模式实现的话,不仅需要增加MiniWebView类,还需要增加具体工厂类(MiniWebViewFactory)。看到这里,可能大家会感觉到,工厂方法模式不但没有减少难度,反而增加了一些类和复杂度。这样来看,是不是没有必要使用工厂方法模式?咱们回顾一六大设计原则,有一个原则是“开放-关闭原则”,简单工厂模式不仅对扩展开放,而且对修改也开放,违反了“开放-关闭原则”。工厂方法模式是简单工厂模式的进一步抽象,它保持了简单工厂模式的优点(去除了客户端与具体产品的依赖),而且克服了它的缺点(违反开放-关闭原则”)。它的缺点是每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发工作量。

抽象工厂模式

什么是抽象工厂?

   抽象工厂提供一个固定的接口,用于创建一系列有关联或相依存的对象,而不必指定其具体类或其创建的细节。客户端与从工厂得到的具体对象之间没有耦合。

抽象工厂与工厂方法模式的区别

抽象工厂与工厂方法模式在许多方面有很多相似之处,以至于我们常常搞不清楚应该在什么时候用哪一个。两个模式都用于相同的目的:创建对象而不让客户端知晓返回了什么确切的具体对象。

工厂方法

1.通过类继承创建抽象产品

2.创建一种产品

3.子类化创建并重写工厂方法来创建新产品

抽象工厂

1.通过对象组合创建抽象产品

2.创建多个系列产品

3.必须修改父类的接口才能支持新的产品

工厂模式:每个抽象产品派生多个具体产品类,每个抽象工厂类派生多个具体工厂类,每个具体工厂类负责一个具体产品的实例创建;

抽象模式:每个抽象产品派生多个具体产品类,每个抽象工厂派生多个具体工厂类,每个具体工厂负责多个(一系列)具体产品的实例创建。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容

  • 工厂设计模式(1)—普通的工厂模式工厂设计模式(2)—枚举实现工厂模式 序: 为什么需要工厂模式? 学习工厂模式之...
    小胖学编程阅读 1,211评论 0 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,103评论 1 32
  • 什么是简单工厂模式? 简单工厂模式主要包含三部分: 工厂类:根据外界的需求,决定创建并返回哪个具体的抽象子类。 抽...
    小小纳兰阅读 224评论 0 0
  • 什么是工厂设计模式?工厂设计模式,顾名思义,就是用来生产对象的,在java中,万物皆对象,这些对象都需要创建,如果...
    星星_点灯阅读 26,132评论 2 20
  • 安徽的宣城到宁国还藏着一条美丽的自驾风景路线,人们把它比喻成“小天路”,这条路,是诗与画的完美结合,不仅风景秀丽而...
    商丘起点阅读 744评论 0 0