一,设计模式
这是一套可复用的,被众人知晓得,经过编目分明的经验总结
作用:使用设计模式是为了可重用代码,让代码更容易理解,保证代码的可靠性,减少代码冗余,使用更少的代码实现更多的逻辑
1,四人帮
1995年 Erich Gamma, Richard Helm, Ralph Johnson ,John Vlissides合作出版了Design Patterns - Elements of Reusable Object-Oriented Software 一书,在此书中共收录了23个设计模式。这四位作者在软件开发领域里也以他们的匿名著称Gang of Four(四人帮,简称GoF),并且是他们在此书中的协作导致了软件设计模式的突破。有时这个匿名GoF也会用于指代前面提到的那本书,第一次将设计模式提升到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。
2,23种设计模式
创建型模式(5):单例模式,抽象工厂模式,建造者模式,工厂模式,原型模式
结构型模式(7):适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式
行为模式(11):模板方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式,访问者模式
3,模式类型:
创建型模式:为了解决对象在创建时的一系列问题
结构型设计模式:为了解决类或者对象之间组合时产生的一系列问题
行为型设计模式:为了解决类或者对象之间交互以及指责分配的一系列问题
4,设计模式:框架,架构和库
1)设计模式:是一套可复用的,被众人知晓的,经过编目分明的,经验总结,他主要强调的是一个设计问题的解决方法。
2)框架:软件框架,是项目软件开发过程中提取特定领域软件的工薪部分形成的体系结构;不同领域的软件项目有着不同的框架类型。框架不是现成可用的应用系统。而是一个半成品,提供了诸多服务,开发人员进行二次开发,实现具体功能的应用系统。
设计模式研究的是针对单一问题的设计思路和解决方法,一个模式可应用于不同的框架和被不同的语言所实现;而框架则是一个应用的体系结构,是一种或多种设计模式和代码的混合体虽然它们有所不同,但却共同致力于使人们的设计可以被重用,在思想上存在着统一性的特点,因而设计模式的思想可以在框架设计中进行应用。
3)架构:简单的说架构就是一个蓝图,是一种设计方案,将客户的不同需求抽象成为抽象组件,并能够描述这些抽象组件之间的通信和调用,偏重于设计。框架比架构更具体,更偏重于技术
4)工具库:是类(方法)的集合,这些类之间可能是相互独立的。可以直接调用它,而不必再写一个。框架也往往是类(方法)的集合;但框架中的各个类并不是孤立的,而框架中的业务逻辑代码是将不同的类“连”在一起,在它们之间建立协作关系
二,工厂模式
1,简单工厂模式
定义:用来创建一种类型的产品实例,所以工厂模式创建的对象是单一的
特点:通过将创建过程寄生在工厂内,可以解决全局变量污染问题,创建的产品对象是单一的,我们可以对工厂进行改进,适应不同的需求
批量生产:
1)在外部创建一个批量工厂,在内部调用工厂,问题是需要在工厂中调用另外创建的一个工厂
2)通过工厂内部进行分支判断,决定创建单个产品还是批量产品,这种方法主要在该工厂内部调用该工厂,依赖工厂名称
3)通过工厂内部进行分支判断,决定创建单个产品还是批量产品,这种方法主要在该工厂内部调用该工厂,arguments.callee 解决对工厂名称的依赖
2,寄生增强工厂
特点:通过寄生在工厂内部的对象添加额外的方法和属性,就是在不改变原类的基础上实现对类的扩展
1)在工厂内实例化的类,叫做寄生
2)对实例化对象扩展属性的方法,叫做增强
3)将独享放回,叫做工厂化
3,安全工厂
特点:任何时间调用工厂,不管有没有new关键词,得到的结果都是一样的
思路:
1)判断this是否是当前对象内的,通过instanceof判断对象是不是某个类实例化出来的
2)如果是通过new出来的,直接对this赋值
3)如果不是new,主动创建对象,并返回该实例
4,工厂方法
定义:通过产品类的抽象,使其创建的业务主要负责用于创建多类产品的实例
特点:创建多类对象,也是对类的封装
思路:
1)声明参数
2)循环创建类
3)对类添加方法
4)将实例化对象返回
三,原型模式
定义:
通过 将对象的原型指向父类的原型实现该对象原型的属性与方法的共享
这是一种基于继承的模式,是一种创建型模式
主要用于处理复杂类,通过提取公共部分实现对类的优化
四,单例模式
定义:只能被实例化一次的对象
1)静态变量
定义之后不能被修改的变量叫做静态变量
实现:
js中的变量是可以任意修改的,前提是这个对象要能被获取,如果我们将这类变量存储到一个封闭作用域,不被外界访问到,此时这个变量就不能被获取,这个封闭作用域可以用闭包实现,闭包返回的对象或者函数执行是在闭包的作用域内部执行的,这样这类函数就可以访问到这类变量,我们将这个函数封装成取值器,也就是对静态变量的获取
注意:
静态变量存储的数据一定是值类型的数据
2)惰性单例
推迟复杂类的实例化时间(晚一点在实例化)
实现:
通过闭包将我们的single封装起来,避免外部访问而被实例化,这样可保证只被实例化一次闭包返回的函数的作用域在闭包内部,所以可以访问到single类对其实例化,这样执行lazySingle才可以对single类实例化
特点:
只能被实例化一次,推迟实例化时间