文章目录
前言
学习了这么长的时间,设计模式却还是浅尝辄止,而且最近在回顾Vue知识的时候,发现了很多常见的设计模式:观察者啊,单例啊什么的。让我意识到,如果想要去读懂Vue底层的话,设计模式的思想是必不可少的。
虽然是在学前端,但是准备通过java来学习设计模式,因为毕竟java是一个强类型的语言,通过java能更直观的去学习设计模式的思想。同时也会尽量去将设计模式通过JavaScript的方式实现出来。
什么是单例模式
字面上来看,就是只有一个实例的模式。简单来说,单例模式就是在整个系统中,保持一个实例,不生成新实例的模式。当然并不是说仅仅只能new
一个对象出来,而是说,针对某个特殊的对象,我们在第一次将它实例化后,以后再次访问时,访问到的一直都是之前实例化好的特殊对象。
为什么需要单例模式
正如上面说的那样,单例模式针对的是某些特殊的对象,那么该对象为什么被针对呢?
需要单例模式实现的对象或系统,一般具有如下特点:
对象
- 需要频繁的被创建、销毁,但在这些过程中无法优化
- 需要比较多的资源:读取配置、产生其他依赖对象
环境
- 希望节省内存
- 希望节省系统性能的开销
- 希望某些资源不被多重占用
- 希望有一个能够统一处理资源和优化的对象
Vuex
和Spring
中的Bean
对象就是如此
通过单例模式,我们能够简单的实现节省性能开销、节省内存、统一管理资源
等功能。因为只有一个实例对象存在,并不会新生成。
如何实现单例模式
单例模式的实现要点
- 保证对象只有一个,不能生成新对象出来
java
以new运算符为例。new本质上是调用了该对象的构造方法。
所以,我们可以通过私有化其构造方法,防止别的地方重新创建该类的实例对象。
同时,在该类内部自己创建自己的实例对象,向外界暴露一个访问的方法即可。
这样我们就能保证该对象只有一个,同时不会生成新对象出来。
public class Singleton {
// 初始化对象,通过static修饰符防止栈溢出(常量池)
private static final Singleton singleton = new Singleton();
// 限制产生多个对象
private Singleton() {
};
// 向外界暴露访问singleton的方法
public static Singleton getSingleton(){
return singleton;
}
}
JavaScript
实现的条件还是不变,保证对象只有一个,不能生成新对象出来。
在java中,我们通过private防止产生了多个对象。
在JavaScript中,如果要实现私有化,首先想到的就是闭包了,闭包还能够使该实例不消失。
其次结合if判断语句,如果实例存在,直接返回,不存在就执行new运算符初始化实例。
闭包实现
let SingleCase = (function Singleton (){
let instance = null
function _init(){
// 此处可以定义一些初始化配置
}
return function(){
console.log