iOS工厂模式简记


之前看了 刘小壮 的【工厂模式三部曲】:简单工厂模式、工厂模式、抽象工厂模式。受益匪浅,强烈推荐去看一下这三篇原文!
下文是个人学习后的简记,用于之后的快速回顾。


1、简单工厂模式

抽象产品类:声明公共特性及属性;
具体产品子类:继承自抽象产品类,去实现具体的操作;
工厂类:根据外界需求,在工厂类中创建对应的产品子类实例对象,并回传给外界,是否创建由外界决定。

iOS工厂模式简记_第1张图片
简单工厂模式.png

代码演示如下,略去部分代码:
iOS工厂模式简记_第2张图片
简单工厂模式-手机.jpg

优点:简单。
缺点
1、创建产品子类的代码几乎相同,只是创建的具体对象不同,若产品子类过多,会有很多条件语句。
2、每次增删某个算法,都需操作工厂类,即,对扩展开放,对修改也开放,不符合 开放-封闭原则
优化
利用 runtime 的反射机制进行改造。符合面向对象编程的 开放-封闭原则

( 开放-封闭原则:对现有代码进行扩展时,不对原有代码进行修改的原则。)


2、工厂方法模式

抽象产品类:声明公共特性及属性;
具体产品子类:继承自抽象产品类,去实现具体的操作;
抽象工厂类:定义创建产品子类的接口,通过接口返回产品子类的对象。与应用程序无关,任何在模式中创建产品子类对象的工厂,都必须实现此接口。
具体工厂子类:继承自抽象工厂类,并重写父类的方法来创建对应的产品子类。

iOS工厂模式简记_第3张图片
工厂方法模式.png

代码演示如下,略去部分代码:
iOS工厂模式简记_第4张图片
工厂方法模式-手机.jpg

优点:更加灵活,增删某种运算,都不会对其他地方造成影响,更加符合 开放-封闭原则
缺点:新增一个抽象子类,意味着工厂子类要跟着成对增加,造成生成过多的类,模式的复杂度也随之增加。


3、抽象工厂模式

定义了每个系列的产品子类创建所需的方法,而无需指定它们具体的类型。也叫 Kit模式

抽象产品类:声明公共特性及属性;
具体产品子类:继承自抽象产品类,去实现具体的操作;
抽象工厂类:定义创建产品子类的接口,根据系列中不同类型的产品子类可能会有多种行为。
具体工厂子类:继承自抽象工厂类,根据当前具体产品子类对应的系列,重写父类的方法来创建对应的产品子类。

抽象工厂模式和工厂方法模式很相似,但是前者将抽象发挥到极致,是三种工厂模式中最抽象的一种设计模式。
工厂方法模式是针对单个类型的抽象类,而抽象工厂模式是针对具有相同结构的一系列类型的抽象类。


抽象工厂模式.png

代码演示如下,略去部分代码:


iOS工厂模式简记_第5张图片
抽象工厂模式-手机.jpg

优点
1、强大灵活。
2、工厂子类对应的是多个系列的产品子类,可以统一控制多个系列的产品子类,更好的利用了工厂子类,适合更加复杂的业务需求。
3、完美符合 开放-封闭原则
缺点
1、模式比较庞大,所以需要在合适的业务场景使用,不然会适得其反。


4、总结

1、 三种工厂模式的共同点:继承自抽象类(抽象产品类/抽象工厂类)的子类(产品子类/工厂子类),都必须对抽象类定义的方法给出对应的实现,此模式就叫做 工厂模式

2、工厂模式的核心:抽象+多态。
抽象子类继承自抽象类,对抽象类中定义的方法和属性给出不同的实现方式,通过多态的方式进行方法实现和调用,构成了工厂模式的核心。

3、在工厂类中对开放封闭原则有着完美的体现,对扩展的开放以及对修改的封闭。
例如,最抽象的抽象工厂模式,
a、抽象工厂模式中增加新的系列(苹果系列),直接扩展一个工厂子类 (苹果工厂子类)及对应的产品子类(苹果Phone产品子类、苹果TV产品子类),对整个模式框架不会带来其他影响。
b、如果增加一个新的类型(如电脑),创建新的类型对应的类(电脑的抽象产品类,各系列的电脑产品子类),并对整个抽象工厂类(添加生产电脑)及其工厂子类(各系列对应实现的生产电脑)进行方法扩展。

4、在外界使用产品子类的功能时,不需要知道任何关于产品子类的特征,产品子类也不会出现在外界,外界只需要和抽象类打交道就可以。
工厂模式将产品子类的创建和实现分离,具体的创建操作由工厂类来进行,产品子类只需要关注业务即可,外界不需要知道产品子类实例化的过程。这种方式非常灵活并易于扩展,而且在大型项目中尤为明显,可以很好的避免代码量过多的问题。

你可能感兴趣的:(iOS工厂模式简记)