我是靠谱客的博主 年轻发卡,最近开发中收集的这篇文章主要介绍2023-01-26 JS设计模式-单例模式:单例模式的原理和实现,懒汉模式和饿汉模式,单例模式实现登录框,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 1.什么是单例模式?
- 介绍
- 特点
- 结构
- 2.如何实现一个单例模式?
- 思路
- 实现代码
- 3.单例模式的优缺点
- 4.懒汉模式和饿汉模式
- 懒汉模式:一开始不会实例化,什么时候用才new出来实例化
- 饿汉模式:一开始类加载时就实例化并创建单例对象
- 懒汉模式和饿汉模式的对比
- 5.单例模式的常见应用场景
- 6.单例模式模拟登录框
1.什么是单例模式?
介绍
单例模式是最简单的设计模式之一,属于创建型模式,单例模式提供了一种创建对象的最佳方式
特点
- 单例模式的类(单例类)只有一个实例对象
- 这个单例对象必须由单例类创建
- 单例类对外提供一个访问这个单例的全局访问点
*总的来说就是,确保只有一个实例,并提供全局访问
结构
单例类:包含一个实例且能自行创建这个实例的类
访问类:使用单例的类
2.如何实现一个单例模式?
思路
通过单例模式的特点:一个类只有一个实例,
先判断实例存在与否,
若存在,则直接返回
若不存在,则创建了再返回
*在JS中单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象
实现代码
用一个变量来标记当前是否已经为某个类创建了这个单例对象,
若是,则在下一次获取实例时直接返回之前创建的对象
写法一:
let Singleton = function(name) {
this.name = name;
this.instance = null;
};
//Singleton.prototype.getName = function() {
// alert(this.name);
//};
Singleton.getInstance = function(name) {
if (!this.instance) {
this.instance = new Singleton(name);
}
return this.instance;
};
let s1 = Singleton.getInstance("zhangsan");
let s2 = Singleton.getInstance("lisi");
console.log(s1 === s2); //true
写法二:
let Singleton = function(name) {
this.name = name;
this.instance = null;
};
//自执行函数+闭包
Singleton.getInstance = (function(name) {
var instance = null;
return function(name) {
if (!instance) {
instance = new Singleton(name);
}
return instance;
}
})();
3.单例模式的优缺点
从上面的实例可以知道,单例模式全程只创建一个对象实例,这样就不用创建和销毁实例,但是却不能适用于动态拓展对象
优点:适用于单一对象,只生成一个对象实例,避免频繁创建和销毁实例,减少内存占用
缺点:不适用于动态扩展对象,或者需要创建多个相似对象的场景
4.懒汉模式和饿汉模式
懒汉模式:一开始不会实例化,什么时候用才new出来实例化
Singleton类被加载时,不会立即实例化==>等到第一次使用这个实例的时候再实例化
第一次调用getInstance时,才真正的实例化
饿汉模式:一开始类加载时就实例化并创建单例对象
"饿"是指:只要类被加载,实例就会立即创建==>实例创建时机比较早
只要类被加载,立即实例化Singleton实例,后续不论怎么操作,只要严格使用getInstance,就不会出现其他实例
懒汉模式和饿汉模式的对比
懒汉模式比饿汉模式效率更高:
懒汉模式中,若getInstance一直没有被调用,此时实例化的过程也就被省略掉了,又称"延时加载"
它是通过"实例用不到"来达到节省实例化开销的目的
5.单例模式的常见应用场景
- Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~
- 网站的计数器,一般也是采用单例模式实现,否则难以同步。
- 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
- Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
单例模式应用的场景一般发现在以下条件下:
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
6.单例模式模拟登录框
// 单例模式模拟登录框
class LoginForm {
constructor() {
this.state = "hide"
}
show() {
if (this.state === "show") {
alert("showing now!");
return;
}
this.state = "show";
console.log("登录框已经显示!");
}
hide() {
if (this.state === "hide") {
alert("hideing now!");
return;
}
this.state = "hide";
console.log("登录框已经隐藏!");
}
}
LoginForm.getInstance = (function() {
let instance = null;
return function() {
if (!instance) {
instance = new LoginForm();
}
return instance;
}
})();
var login1 = LoginForm.getInstance();
var login2 = LoginForm.getInstance();
console.log(login1 === login2);
// 验证一
// login1.show(); //登录框已经显示!
// login2.hide(); //登录框已经隐藏!
// 验证二
login1.show(); //登录框已经显示!
login2.show(); //弹窗:showing now!
最后
以上就是年轻发卡为你收集整理的2023-01-26 JS设计模式-单例模式:单例模式的原理和实现,懒汉模式和饿汉模式,单例模式实现登录框的全部内容,希望文章能够帮你解决2023-01-26 JS设计模式-单例模式:单例模式的原理和实现,懒汉模式和饿汉模式,单例模式实现登录框所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复