likes
comments
collection
share

iOS 设计模式

作者站长头像
站长
· 阅读数 24

iOS 设计模式

一 简单工厂方法

前序

简单工厂方法属于工厂模式,所以说简单工厂方法之前,先来说一下工厂模式。

工厂模式的定义:专门定义一个类(工厂类)负责创建其他类(产品类)的实例,被创建的实例通常具有共同的父类。 一般可以由一个工厂类,根据传入的参数,动态的决定创建出哪一个产品类的实例。

工厂模式又分为工厂方法,简单工厂方法,抽象工厂方法。工厂模式是利用了面向对象3大特性之一——多态,父类指针指向子类对象这个特性。父类定义方法,子类实现。

多态性:一个父类可以有多个子类,每个子类在继承了父类的方法后,对该父类方法分别进行重写,那么每个子类的方法是不一样的,一个父类方法被改写成多种形态,叫做多态。

参与者

  • 工厂角色(Factory):接受客户端的请求,通过请求负责创建相应的产品对象。
  • 抽象产品角色(Product):是工厂模式所创建对象的父类或是共同拥有的方法。
  • 具体产品角色:工厂模式所创建的对象都是这个角色的实例(Product1或Produc2的实例)

应用:个人理解,在第三方的时候可以用到,方便替换。系统方法NSString和NSNumber应用了抽象工厂方法。

参考链接:

www.jianshu.com/p/6310deea5…

www.jianshu.com/p/c85531b24…

1. 模型图

iOS 设计模式

2. 特点

工厂类只有一个,它集中了所有产品创建的逻辑。 通常使用静态方法,这使得工厂类无法由子类继承,难以拓展。

3. 拓展

简单工厂方法又可以分为普通简单工厂,多方法简单工厂和静态简单工厂。原理都一样。

4. 调用示例

iOS 设计模式

二 工厂方法

1. 模型图

iOS 设计模式

2. 定义

工厂法使用OOP(object - Oriented Programming:面向对象编程)的多态性,将工厂和产品都抽象出一个基类,在基类中定义统一的方法,然后在具体的工厂中创建具体的产品。

3. 参与者
  • 抽象工厂角色:是创建对象的工厂的父类(Factory)或者共同拥有的方法。
  • 具体工厂角色:实现了抽象工厂方法的具体类(Factory1、Factory2),并且受到应用程序的调用以创建产品对象。
  • 抽象产品角色:是工厂方法所创建对象的父类(Product)或是共同拥有的方法。
  • 具体产品角色:这个角色实现了抽象产品角色所声名的方法。工厂方法所创建的对象都是某个具体产品角色(Product1、Product2)的实例。
4. 特点

降低了工厂类的内聚,满足了类之间的层次关系,符合面向对象设计中的单一职责原则。 有利于程序的拓展,每次需要一个新的产品,只需要新建一个具体工厂来生成新的产品。

5. 调用示例

iOS 设计模式

三 抽象工厂方法

1. 模型图

iOS 设计模式

2. 原理

每个抽象产品派生多个具体产品类,每个抽象工厂派生多个具体工厂类,每个具体工厂负责多个(一系列)具体产品的实例创建。 应用:NSString、NSNumber等都是使用了这种设计。

3. 抽象工厂模式与工厂模式的区别:

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

4. 参与者

抽象工厂角色:担任这个角色的是工厂方法模式的核心。根据传入参数初始化不同具体工厂实例。 具体工厂角色:实现了抽象工厂方法的具体类,并且受到应用程序的调用以创建产品对象。 抽象产品角色:是工厂方法所创建对象的父类(Product、ProductPro)或是共同拥有的方法。 具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。

5. 调用示例

iOS 设计模式

四 单例模式

1. 单例类举例

UIApplication(应用程序实例类)

NSNotificationCenter(消息中心类)

NSFileManager(文件管理类)

NSUserDefaults(应用程序设置)

NSURLCache(请求缓存类)

NSHTTPCookieStorage(应用程序cookies池)

2. 单例在手机存储器中的位置

iOS 设计模式 单例对象一旦建立,对象指针保存在静态区,单例对象在堆中分配的内存空间,只在应用程序终止后才会被释放

3. 示例代码

苹果官方推荐用dispatch_once_t

iOS 设计模式

4. 单例模式的优缺点
  • 优点:

    • 在整个程序中只会实例化一次,所以在程序如果出了问题,可以快速的定位问题所在;

    • 由于在整个程序中只存在一个对象,节省了系统内存资源,提高了程序的运行效率;

  • 缺点

    • 不能被继承,不能有子类;

    • 不易被重写或扩展(可以使用分类);

    • 同时,由于单例对象只要程序在运行中就会一直占用系统内存,该对象在闲置时并不能销毁,在闲置时也消耗了系统内存资源;

5. 注意

为了避免同事多次创建单例,在.h文件禁用这些方法,调用的时候就报错。

+(instancetype)new __attribute__((unavailable("OneTimeClass类只能初始化一次")));
-(instancetype)copy __attribute__((unavailable("OneTimeClass类只能初始化一次")));
-(instancetype) mutableCopy  __attribute__((unavailable("OneTimeClass类只能初始化一次")));

五 中介者模式

学习链接:www.jianshu.com/p/8f103040f…

1. 模型图

iOS 设计模式

2. 角色
  • AbstractMediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。(接口继承的话UML图应该是虚线加三角)
  • ConcreteMediator:具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。
  • Colleague(AbstractClient):抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象,持有抽象中介者。同事在这里的意思是想要直接通信的类,例如买卖双房通过中介沟通。
  • ConcreteColleague1、ConcreteColleague2:具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。
3. Demo

demo 图文解析

注意:中介者和同事是可以相互持有的,注意引用的时候,需要一方弱引用。

iOS 设计模式

  • 1)AbstractMediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。(接口继承的话UML图应该是虚线加三角)
  • (2)ConcreteMediator(MediatorLJ):具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。
  • (3)Colleague(AbstractClient):抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象,持有抽象中介者。同事在这里的意思是想要直接通信的类,例如买卖双房通过中介沟通。
  • (4)ConcreteColleague1(Buyer)、ConcreteColleague2(Seller):具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。

六 策略模式 Strategy

1. 定义

这种设计模式是对行为、算法的包装,把同一个抽象方法指派给不同的子类对象实现。,并且使它们可相互替换。 策略模式(Strategy)就是对if-else、switch-case这类多分支结构的解耦,把每一种情况封装成一种策略,实现控制器代码的简化。

2. 策略模式和工厂模式的区别

工厂模式更像是对对象的管理,而策略模式是对行为的管理。

3. 优缺点
  • 优点
    1. 算法可以自由切换。
    2. 避免使用多重条件判断。
    3. 扩展性良好。
  • 缺点 
    1. 策略类会增多。
    2. 所有策略类都需要对外暴露。

写在最后

未完待续,有时间再补充剩下的设计模式

转载自:https://juejin.cn/post/6979536307756204040
评论
请登录