工厂设计模式

一、工厂模式:

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

二、分类:

简单工厂模式

工厂模式

抽象工厂模式

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

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

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

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

简单工厂模式

例子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.必须修改父类的接口才能支持新的产品

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

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

你可能感兴趣的:(工厂设计模式)