经典的设计模式一共有23种,分别是创建型,结构型,行为型。
创建型有四种,分别是,单例模式,工厂模式,建造者模式,原型模式。
单例模式
定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式主要是通过 if 语句判断是否已经创建过一个实例。如果已创建返回该实例。
开发中我们有些对象只需要一个,比如浏览器的 window 对象,还有 Vue 框架中的 VueX 全局管理对象。
单例模式的实现方式:
-
恶汉式: 在类加载期间,就实例化 instance。
-
懒汉式:在需要的时候再创建instance。
-
双重检测: 只要 instance 被创建之后,再调用 getInstance()函数也不会再进入加锁逻辑中。
-
静态内部类: 利用 java 静态内部类实现单例。
-
枚举: Java枚举本身特性。
单例存在哪些问题?
-
单例对 OOP 特性的支持不友好
-
单例会隐藏类之间的依赖关系
-
单例对代码的扩展性不友好
-
单例对代码的可测试性不友好
-
单例不支持有参数的构造函数
工厂模式
定义:将创建对象的过程单独封装。
当我们需要创建一大堆类似的对象的时候,通过不同的条件生成不同的对象。使用工厂模式,只需要把参数传入即可。
当创建对象的逻辑比较简单的时候,使用简单工厂模式。
当创建对象的逻辑比较复杂的时候,使用工厂方法。
建造者模式
定义:造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品。
建造者模式参数是不固定的,根据传入的参数定制。
工厂模式和建造者模式区别:
工厂模式是用来创建不同但是相关类型的对象,由给定的参数来绝对创建那种类型的对象。建造者模式是用来创建一种类型的复杂对象,可以通过设置不同的可选参数定制化创建不同的对象。
原型模式
定义:如果对象创建的成本比较大,二一个类的不同对象之间差别不大,我们就可以利用已有对象进行复杂,来创建对象,达到节约时间的目的。
实现方法:
1.深拷贝可以得到一个完全独立的对象。
2.浅拷贝只复制基本数据类型和引用类型的内存地址。
参考资料
极客时间《设计模式之美》
曾探 《JavaScript 设计模式和开发实践》
修言 《JavaScript 设计模式核⼼原理与应⽤实践》