一、设计模式
设计模式主要分为三大类:创建型、结构型、行为型:
- 创建型
主要解决:对象的创建问题
解耦:将创建和使用代码解耦(将对象的创建和使用分离,对用户隐藏实例的创建细节)
常用:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式
不常用:原型模式 - 结构型
主要解决:类或对象的组合或组装问题
解耦:将不同功能代码解耦
常用:代理模式、装饰者模式、桥接模式、适配器模式
不常用:门面模式、组合模式、享元模式 - 行为型
主要解决:类或对象之间的交互问题
解耦:将不同的行为代码解耦
常用:观察者模式、模板模式、策略模式、责任链模式、迭代器模式、状态模式
不常用:访问者模式、备忘录模式、命令模式、解释器模式、中介模式
参考教程1:ios设计模式
参考教程2:三种类型设计模式主要解决的问题
1.创建型
1.1 创建型:单例模式
1)概念:保证一个类只有一个实例,并提供一个全局访问点。
2)意义:节约系统资源(避免频繁创建销毁对象影响性能)
ps:比如说MySingleton类中实现了单例方法sharedInstance,那么调用sharedInstance所返回的对象都是同一个,但是如果我直接 [MySingleton new],那其实返回的不是单例对象,而是新建了一个对象,如果我想new创建的对象也是单例对象,那么可以在MySingleton类中重写new方法(在new方法中调用[MySingleton sharedInstance])
1.2 创建型:工厂模式(简单工厂、工厂方法、抽象工厂)
1)概念:
简单工厂:定义一个工厂类,根参数的不同返回不同类的实例,被创建的实例通常都有共同的父类
违反开闭原则
缺点:工厂类集中类所有实例的创建逻辑,指责过重,1⃣️万一出错,整个系统受影响2⃣️万一要增加,就要修改工厂类的逻辑
工厂方法:将产品的具体创建过程交给具体的工厂子类去完成(抽象工厂类中知声明方法,工厂子类实现方法)。
遵守开闭原则
缺点:添加新产品就需要编写新的具体产品类&具体工厂类,类的个数成对增加
抽象工厂:一个工厂子类可以生产多个产品
违反开闭原则
总结:
- 简单工厂模式实现产品创建和使用的分离,但是暴露了一个问题:工厂类职责太重。
- 工厂方法模式实现每个工厂子类分别负责一种产品的创建,解决了简单工厂方法中工厂类的职责太重的问题,但是暴露了一个问题:每个工厂子类只能生产一种产品,导致系统中存在大量工厂子类,增加系统开销
- 抽象工厂模式实现一个工厂可以生产多个产品,但是这导致违反开闭原则
2)意义:
2.结构型
2.1 结构型:代理模式
1)概念
2)意义:解决1)无法直接访问某个对象2)访问某个对象存在困难,保证客户端使用的透明性
目前我没懂的点:以下两件事和意义直接的联系
我现在用代理主要处理2件事:
- 1)设置属性:比如说tableViewCell的num等
- 2)设置事件:点击cell之后页面跳转
不知道对不对:实现cell类的时候,定义一个代理,声明一个方法(methodA),写cell逻辑的时候:如果发生A(比如说点击了cell)则执行methodA,但是这个methodA具体实现留给外面,为什么呢,因为层面不同,访问不到你需要的属性。比如说你在页面A中创建cell,点击cell的时候要基于A实现页面跳转,同理再页面B中,要基于B实现页面跳转,你在写cell类的时候,显然无法把页面A、B写入cell中,只能说在页面A中写逻辑的时候,传入页面A的参数----》这也就对应了意义中的“无法直接访问某个对象或访问困难”
2.2 结构型:装饰者模式
1)概念:替代继承的技术,通过无须定义子类的方式来给对象动态增加职责
2)意义:可以动态增加或删除对象的职责,符合开闭原则,就扩展功能而言,装饰模式比继承更加灵活
补充:比如分类,常问:分类和扩展的区别
3.行为型
3.1 行为型:观察者模式
1)概念:一个对象的值改变就告诉其他对象。可以一对多。
2)意义:用于描述对象之间的依赖关系,实现多个对象之间的联动。