设计模式

一 工厂模式

学习链接
www.jianshu.com/p/6310deea5…
www.jianshu.com/p/c85531b24…

说明

工厂模式又分为工厂方法,简单工厂方法,抽象工厂方法。工厂模式是利用了面向对象3大特性之一——多态,父类指针指向子类对象这个特性。父类定义方法,子类实现。
多态性:一个父类可以有多个子类,每个子类在继承了父类的方法后,对该父类方法分别进行重写,那么每个子类的方法是不一样的,一个父类方法被改写成多种形态,叫做多态。
应用:个人理解,在第三方的时候可以用到,方便替换。系统方法NSString和NSNumber应用了抽象工厂方法。

应用

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

分类

1. 简单工厂方法

lfac75106fcb094b3965965fc5d5ce883-s-m59e732fb2df123a635a85d44e26efe82.jpg

① 定义

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

② 参与者

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

③ 拓展

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

④ 特点

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

⑤ 调用示例

l9fa4bf34edf9e392ee5b7edd6b93ec78-s-m616f8bc2e851183a550d4fb00b48cc5e.jpg

2. 工厂方法

l612ece5a0ed68c030d8517ff6c7e943e-s-m225af5dc31b2e9db5aaa973b4cbb5049.jpg

① 定义

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

② 参与者

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

③ 特点

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

④ 调用示例

lf76e98cafc9507e77a0fca8f31f65610-s-m94eb4731b3be362800b3b96c88df572d.jpg

3. 抽象工厂方法

l3e8639f7545ccc3e85238bc2f3d9d78f-s-mb7cda35af029d21f0749cd46e943db5a.jpg

① 原理

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

② 抽象工厂模式与工厂模式的区别:

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

③ 参与者

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

④ 调用示例

l6a4d46006bbbae94fc684b41902f1c79-s-m5329413f2ffb8c0bd19197df268e861b.jpg

二 单例模式

① 单例类举例

UIApplication(应用程序实例类)

NSNotificationCenter(消息中心类)

NSFileManager(文件管理类)

NSUserDefaults(应用程序设置)

NSURLCache(请求缓存类)

NSHTTPCookieStorage(应用程序cookies池)

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

l9d58ae5256710eb66f411af273dc7905-s-mbe048f031393e17a426e8b6627662188.jpg
单例对象一旦建立,对象指针保存在静态区,单例对象在堆中分配的内存空间,只在应用程序终止后才会被释放

③ 示例代码

苹果官方推荐用dispatch_once_t

l6e8d0c144bff34772091120d8779cd99-s-m15a389518e4952f7de55676ce318f0ae.jpg

④ 单例模式的优缺点
  • 优点:

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

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

  • 缺点

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

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

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

⑤ 为了避免同事多次创建单例,在.h文件禁用这些方法,调用的时候就报错。
+(instancetype)new __attribute__((unavailable("OneTimeClass类只能初始化一次")));
-(instancetype)copy __attribute__((unavailable("OneTimeClass类只能初始化一次")));
-(instancetype) mutableCopy  __attribute__((unavailable("OneTimeClass类只能初始化一次")));
复制代码

三 中介者模式

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

l5e7771eabec7e6fb94fa233fff2abebe-s-m353b2a4e7448961177ed2be73b4715b0.jpg

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

demo 图文解析

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

l7460960abb5a04c4f1c92b54cea1515f-s-m55a7fc8579cc4d556c73782bb399741d.jpg

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

四 策略模式 Strategy

① 定义

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

② 策略模式和工厂模式的区别

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

③ 优缺点
  • 优点
    • 1、算法可以自由切换。
    • 2、避免使用多重条件判断。
    • 3、扩展性良好。
  • 缺点: 
    • 1、策略类会增多。
    • 2、所有策略类都需要对外暴露。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享