iOS 设计模式
一 简单工厂方法
前序
简单工厂方法属于工厂模式,所以说简单工厂方法之前,先来说一下工厂模式。
工厂模式的定义:专门定义一个类(工厂类)负责创建其他类(产品类)的实例,被创建的实例通常具有共同的父类。 一般可以由一个工厂类,根据传入的参数,动态的决定创建出哪一个产品类的实例。
工厂模式又分为工厂方法,简单工厂方法,抽象工厂方法。工厂模式是利用了面向对象3大特性之一——多态,父类指针指向子类对象这个特性。父类定义方法,子类实现。
多态性:一个父类可以有多个子类,每个子类在继承了父类的方法后,对该父类方法分别进行重写,那么每个子类的方法是不一样的,一个父类方法被改写成多种形态,叫做多态。
参与者
- 工厂角色(Factory):接受客户端的请求,通过请求负责创建相应的产品对象。
- 抽象产品角色(Product):是工厂模式所创建对象的父类或是共同拥有的方法。
- 具体产品角色:工厂模式所创建的对象都是这个角色的实例(Product1或Produc2的实例)
应用:个人理解,在第三方的时候可以用到,方便替换。系统方法NSString和NSNumber应用了抽象工厂方法。
参考链接:
1. 模型图
2. 特点
工厂类只有一个,它集中了所有产品创建的逻辑。 通常使用静态方法,这使得工厂类无法由子类继承,难以拓展。
3. 拓展
简单工厂方法又可以分为普通简单工厂,多方法简单工厂和静态简单工厂。原理都一样。
4. 调用示例
二 工厂方法
1. 模型图
2. 定义
工厂法使用OOP(object - Oriented Programming:面向对象编程)的多态性,将工厂和产品都抽象出一个基类,在基类中定义统一的方法,然后在具体的工厂中创建具体的产品。
3. 参与者
- 抽象工厂角色:是创建对象的工厂的父类(Factory)或者共同拥有的方法。
- 具体工厂角色:实现了抽象工厂方法的具体类(Factory1、Factory2),并且受到应用程序的调用以创建产品对象。
- 抽象产品角色:是工厂方法所创建对象的父类(Product)或是共同拥有的方法。
- 具体产品角色:这个角色实现了抽象产品角色所声名的方法。工厂方法所创建的对象都是某个具体产品角色(Product1、Product2)的实例。
4. 特点
降低了工厂类的内聚,满足了类之间的层次关系,符合面向对象设计中的单一职责原则。 有利于程序的拓展,每次需要一个新的产品,只需要新建一个具体工厂来生成新的产品。
5. 调用示例
三 抽象工厂方法
1. 模型图
2. 原理
每个抽象产品派生多个具体产品类,每个抽象工厂派生多个具体工厂类,每个具体工厂负责多个(一系列)具体产品的实例创建。 应用:NSString、NSNumber等都是使用了这种设计。
3. 抽象工厂模式与工厂模式的区别:
工厂模式:每个抽象产品派生多个具体产品类,每个抽象工厂类派生多个具体工厂类,每个具体工厂类负责一个具体产品的实例创建; 抽象工厂模式:每个抽象工厂派生多个具体工厂类,每个具体工厂负责多个(一系列)具体产品的实例创建。
4. 参与者
抽象工厂角色:担任这个角色的是工厂方法模式的核心。根据传入参数初始化不同具体工厂实例。 具体工厂角色:实现了抽象工厂方法的具体类,并且受到应用程序的调用以创建产品对象。 抽象产品角色:是工厂方法所创建对象的父类(Product、ProductPro)或是共同拥有的方法。 具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。
5. 调用示例
四 单例模式
1. 单例类举例
UIApplication(应用程序实例类)
NSNotificationCenter(消息中心类)
NSFileManager(文件管理类)
NSUserDefaults(应用程序设置)
NSURLCache(请求缓存类)
NSHTTPCookieStorage(应用程序cookies池)
2. 单例在手机存储器中的位置
单例对象一旦建立,对象指针保存在静态区,单例对象在堆中分配的内存空间,只在应用程序终止后才会被释放
3. 示例代码
苹果官方推荐用dispatch_once_t
4. 单例模式的优缺点
-
优点:
-
在整个程序中只会实例化一次,所以在程序如果出了问题,可以快速的定位问题所在;
-
由于在整个程序中只存在一个对象,节省了系统内存资源,提高了程序的运行效率;
-
-
缺点
-
不能被继承,不能有子类;
-
不易被重写或扩展(可以使用分类);
-
同时,由于单例对象只要程序在运行中就会一直占用系统内存,该对象在闲置时并不能销毁,在闲置时也消耗了系统内存资源;
-
5. 注意
为了避免同事多次创建单例,在.h文件禁用这些方法,调用的时候就报错。
+(instancetype)new __attribute__((unavailable("OneTimeClass类只能初始化一次")));
-(instancetype)copy __attribute__((unavailable("OneTimeClass类只能初始化一次")));
-(instancetype) mutableCopy __attribute__((unavailable("OneTimeClass类只能初始化一次")));
五 中介者模式
学习链接:www.jianshu.com/p/8f103040f…
1. 模型图
2. 角色
- AbstractMediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。(接口继承的话UML图应该是虚线加三角)
- ConcreteMediator:具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。
- Colleague(AbstractClient):抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象,持有抽象中介者。同事在这里的意思是想要直接通信的类,例如买卖双房通过中介沟通。
- ConcreteColleague1、ConcreteColleague2:具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。
3. Demo
demo 图文解析
注意:中介者和同事是可以相互持有的,注意引用的时候,需要一方弱引用。
- 1)AbstractMediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。(接口继承的话UML图应该是虚线加三角)
- (2)ConcreteMediator(MediatorLJ):具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。
- (3)Colleague(AbstractClient):抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象,持有抽象中介者。同事在这里的意思是想要直接通信的类,例如买卖双房通过中介沟通。
- (4)ConcreteColleague1(Buyer)、ConcreteColleague2(Seller):具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。
六 策略模式 Strategy
1. 定义
这种设计模式是对行为、算法的包装,把同一个抽象方法指派给不同的子类对象实现。,并且使它们可相互替换。 策略模式(Strategy)就是对if-else、switch-case这类多分支结构的解耦,把每一种情况封装成一种策略,实现控制器代码的简化。
2. 策略模式和工厂模式的区别
工厂模式更像是对对象的管理,而策略模式是对行为的管理。
3. 优缺点
- 优点
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
- 缺点
- 策略类会增多。
- 所有策略类都需要对外暴露。
写在最后
未完待续,有时间再补充剩下的设计模式
转载自:https://juejin.cn/post/6979536307756204040