设计模式系列(二)--创建型设计模式

2019/2/27 posted in  设计模式

接下来将进入设计模式里的创建型设计模式。这里将对设计模式的使用场景与优劣,以及UML图做描述。
具体的实现Demo请进入DesignPatterns iOS工程实现查看

0. 简单工厂(if type)

(通过传类型进行区分,对修改是开放的,所有不好)
简单工厂就是一个工厂,将类型传进去,在一个类里面生成不同的类型。
弊端:这个工厂会包括多个需要生产的产品的引用。而且对于修改是开放的,因为需要修改类里面的内容。对于扩展也是需要在同一个类里面做修改。

1. 工厂方法(一个产品线)

使用场景:
当需要创建多种分Type的对象时,特别是针对多种类型有共同的行为特征时。或者写出简单工厂时,思考是否可以用工厂方法。

好处:
工厂方法遵循开闭原则就是”对扩展开放,对修改关闭”,再说白点就是实现工厂方法以后要进行扩展时不需要修改原有代码(你看简单工厂里添加类型时时不是还要修改if语句),只需要增加一个工厂实现类产品实现类就可以。

实现:
产品基类(协议),工厂基类(协议)。产品实现,工厂实现。客户端直接使用工厂生产相应的产品就可以了。

费曼工厂方法会针对每个产品都有一个工厂实现类。工厂实现类有一个相应工厂的一个实现,这个实现是生产产品的实现。我们可以将工厂方法理解成一个产品线。

2. 抽象工厂(多个产品线及真正的工厂)

使用场景
1.通过对象组合创建抽象产品

2.创建多个系列产品
3.必须修改父类的接口才能支持新的产品

费曼 所谓的抽象工厂,就是将工厂方法的产品线扩大到多个产品线 我们可以将抽象工厂理解成多条产品线(真正的工厂),每一个工厂有其特殊的标识。

突然想到一个例子
”北京杂酱面“ 与 “重庆杂酱面”都是杂酱面,都是配料都是面条,汤,酱,但北京面馆(一个工厂),是北京面条,北京汤,北京酱,重庆面馆(一个工厂)是重庆面条,重庆汤,重庆酱,这个工厂是一个产品线。

3. 单例模式(整个应用程序只用一个对象)

使用场景
在一个应用程序中,当需要在多个地方共享数据时

注意点
注意多线程的使用下的情况。

在实际的使用中,单例模式也不能滥用。举个例子,单例有个isLogin,我判定isLogin为true进入一个操作,其他线程将isLogin改成false,那么在这个单例里执行的操作都将有问题。
因为数据被其他线程改变了。在实际的开发中,这种情况会是一个大坑。

4. 构建者(子部分算法的变化无常,当构成这个对象组成相对固定)

构建者模式使用多个简单的对象一步一步构建一个复杂的对象。
主要解决的问题,有时候面临着"一个复杂的对象"的创建工作,通常其子对象部分有着剧烈的变换,需要将他们组合在一起

我的理解是,当创建一个对象,这个对象需要很多组合的对象(且这些组合的对象有一定固定算法,我需要将这些对象随意的组合成我需要的对象)时,用构建者模式。(区别与抽象工厂,抽象工厂创建后不是随意的组合,是工厂创建后就只能生产固定的产品了,抽象工厂的变换在外部,而构建者的变换在内部,哈哈,就是这个意思)
例如
构造电脑,电脑的组成由CPU,显示器,主板,这是相对固定的。但子部分,CPU有各种实现的算法。所以这种情况使用构建者最好。

5. 原型模式

原型模式
原型遵循copy或者clone的协议。执行copy或者clone就是按照原型创建一个对象。在iOS里理解成copy就行了。