我是靠谱客的博主 年轻发卡,最近开发中收集的这篇文章主要介绍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设计模式-单例模式:单例模式的原理和实现,懒汉模式和饿汉模式,单例模式实现登录框所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部