梦见出国了是什么意思| 酒后吐吃什么可以缓解| 湿疹用什么药好得最快最有效| 暗经是什么意思| 睡眠浅是什么原因| 胃痛是什么原因| 肾虚吃什么东西补得快| 什么是阴阳水| 桑是什么意思| 驴胶补血颗粒什么时候喝最好| 白羊座和什么星座最配| 科目一和科目四有什么区别| 左眼跳什么预兆| 可什么意思| 杰克琼斯属于什么档次| 睡不着觉去医院挂什么科| 蛇喜欢吃什么| 太阳是什么| 脂肪是什么组织| 蛇吃什么| twins什么意思| kcl是什么药| 免疫力差吃什么可以增强抵抗力| 说一个人轴是什么意思| 户主有什么权利| 空调管滴水是什么原因| 落是什么生肖| 脸上长痘痘用什么药膏效果好| 景德镇有什么好玩的| 小腿肚子抽筋是什么原因| 树脂材料是什么| 做肠镜检查什么| 瓜蒌根为什么叫天花粉| 梦见已故朋友什么预兆| 三餐两点什么意思| asa是什么意思| 梦到吃蛇肉预示着什么| 木冉读什么| 血管造影检查什么| cpc什么意思| 二甲双胍缓释片什么时候吃| 冥想有什么好处| 一九八三年属什么生肖| 兆后面是什么单位| 剧透什么意思| 高级别上皮内瘤变是什么意思| 发烧酒精擦什么部位| 乌金是什么| 什么是飞机杯| 吉士粉是什么粉| camel什么意思| 香叶是什么树叶| camouflage什么意思| 泥鳅喜欢吃什么食物| 什么叫血糖| 1996年属什么生肖| 黄芪泡水喝有什么好处| 梦到前男友是什么意思| 钢笔ef尖是什么意思| 小孩舌头白是什么原因| 左手食指麻木是什么原因引起的| 手心热吃什么药| 机体是什么意思| 梦到吃螃蟹是什么意思| 红色象征什么| 流汗有什么好处| 最是什么意思| 河南什么烟出名| 吃什么食物降尿酸最快| 吃烧烤后吃什么水果可以帮助排毒| 眼前发黑是什么原因| 代谢是什么| 敢是什么意思| 新生儿黄疸高有什么风险| 马加其念什么| 兰花指什么生肖| 助产士一般什么学历| 国士无双是什么意思| 金木水火土各代表什么| 嗓子发干是什么原因| 庚寅五行属什么| 我做错了什么| 腋下长痘痘是什么原因| 儿童吃手指是什么原因| 牙龈肿痛吃什么药最见效| 孕妇喝什么汤| 达克宁栓治疗什么妇科病| 做包皮挂什么科| 什么是频率| 64年的龙是什么命| 荷花和莲花有什么区别| 地奥心血康软胶囊主治什么病| 例假少吃什么能让量多| 百日咳吃什么药| 断袖是什么意思| 红眼病滴什么眼药水| 掩耳盗什么| 早孕挂什么科检查| 牙髓炎是什么原因引起的| 皮肤过敏不能吃什么| 韬光养晦下一句是什么| 91是什么网站| 红糖的原料是什么| 孕妇能吃什么| 什么水果最老实| 人为什么要火化| 低血糖有什么危险| 梦见系鞋带是什么意思| 宝宝为什么会吐奶| 流虚汗是什么原因| 手电筒的金属外壳相当于电路中的什么| 上升星座代表什么| 高筋面粉适合做什么| 6月23日是什么星座| 什么情况下吃奥司他韦| 剌是什么意思| 塬字五行属什么| 匮乏是什么意思| 山昆读什么| 腰肌劳损是什么症状| 骨密度t值是什么意思| 什么心什么肺| 震颤是什么症状| 俯卧撑有什么好处| nt是什么币| 脖子淋巴结挂什么科| 尿酸高不能吃什么| 肺实变是什么意思| 名侦探柯南什么时候完结| 艾滋病有什么特征| 捐精有什么要求| 小鬼是什么意思| 种猪是什么意思| 咽干是什么原因| 龟头有点痒擦什么药| 马桶堵了用什么疏通| HP是什么| 宗人府是什么地方| 18年是什么年| 白夜是什么意思| 肚子绞痛吃什么药| 吃什么好| 排山倒海是什么意思| 为什么香蕉不能放冰箱| 适当是什么意思| 1972年属什么| 三羊念什么字| 辟加木念什么| 结石用什么药| 肝上火有什么症状| 异卵双胞胎是什么意思| 天体是什么意思| 董酒是什么香型| 血糖高吃什么主食好| 菜心是什么菜的心| 性病有什么症状| 七月一号什么星座| 为什么痛经| 哺乳期乳腺炎吃什么药| 1037年属什么生肖| 第一颗原子弹叫什么| ipmn是什么意思| 峦是什么意思| 睡觉张嘴巴是什么原因| 女性解脲支原体阳性吃什么药| 什么的寒风| 健康证什么时候可以办| 斗战胜佛是什么意思| 过敏去医院挂什么科| 嘴贱什么意思| 痛风病人不能吃什么| 青青的什么| 看望病人送什么花合适| 手麻了是什么原因| 梦见打死猫有什么预兆| 城隍爷是什么神| 沙蚕是什么动物| 经常挖鼻孔有什么危害| 牛仔裤搭配什么鞋| 八一建军节是什么节日| 北京户口有什么好处| 廉洁奉公是什么意思| 沙悟净的武器叫什么| 尿道口有烧灼感为什么| 木命和什么命最配| 觉悟是什么意思| 八月七号是什么星座| 5月28日什么星座| 血府逐瘀片主治什么病| 娃儿发烧用什么方法退烧快| 宝宝吃什么奶粉好| 猪五行属什么| 蛋糕是什么生肖| 胆囊炎输液用什么药| 俄罗斯特工组织叫什么| 经期吃什么水果| 嗓子老有痰是什么原因| 刺猬为什么叫白仙| 什么是劣药| 勿误是什么意思| 什么的浪花| 人为什么会得抑郁症| 带状疱疹有什么症状| 细菌性阴道病用什么药| tg是什么指标| 又什么又什么的词语| 倒着走路有什么好处| 二月二十是什么星座| 蟑螂卵什么样| 夺目的什么| 高是什么意思| 尿比重偏高是什么原因| 吃葡萄干对身体有什么好处| 眼睛发粘是什么原因| 梦见自己穿孝衣有什么征兆| 总感觉自己有病是什么心理病| 伏特加是什么| 发烧能吃什么水果| 印度是什么制度的国家| 看肝脏挂什么科| 蓝色妖姬的花语是什么| 有什么好听的网名| 大胯疼是什么原因引起| 邻家女孩什么意思| 脚底红润是什么原因| 什么的瞬间作文| 吃什么能解酒| 黑曜石五行属什么| 蒲公英长什么样子| 草莓印是什么意思| 咖啡与什么食物相克| 小孩发烧可以吃什么水果| 肾虚吃什么好| 公积金取出来有什么影响| 女人下巴长痘痘是什么原因| 12月18日什么星座| 黄精什么时候种植| 失眠是什么原因引起的| 面包虫长大后变成什么| 经常喝苏打水有什么好处和坏处| 阵容是什么意思| 怀孕两个月出血是什么原因| 肠粉是用什么材料做的| zf是什么意思| 卵黄囊是什么| 喉咙咳出血是什么原因| 芦笋炒什么好吃| 秋葵什么人不能吃| sport是什么意思| dx是什么药| 感冒是什么原因引起的| 鹅拉绿色粪便是什么病| 幼小衔接班主要教什么| 79年出生属什么生肖| 香港脚是什么| 狼狗是什么品种| 主诉是什么意思| 昆字五行属什么| 腰酸胀是什么原因| 女性吃什么改善更年期| 9月13日是什么日子| 洋盘是什么意思| 痔疮开刀后吃什么好| 车万是什么意思| 百度
Skip to content

面试官:说说你对单例模式的理解?如何实现??#291

@huihuiha

Description

@huihuiha

一、是什么

单例模式(Singleton Pattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建

在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象,如下图所示:

从定义上来看,全局变量好像就是单例模式,但是一般情况我们不认为全局变量是一个单例模式,原因是:

  • 全局命名污染
  • 不易维护,容易被重写覆盖

二、实现

javascript中,实现一个单例模式可以用一个变量来标志当前的类已经创建过对象,如果下次获取当前类的实例时,直接返回之前创建的对象即可,如下:

// 定义一个类
function Singleton(name) {
  this.name = name;
  this.instance = null;
}
// 原型扩展类的一个方法getName()
Singleton.prototype.getName = function() {
  console.log(this.name)
};
// 获取类的实例
Singleton.getInstance = function(name) {
  if(!this.instance) {
      this.instance = new Singleton(name);
  }
  return this.instance
};

// 获取对象1
const a = Singleton.getInstance('a');
// 获取对象2
const b = Singleton.getInstance('b');
// 进行比较
console.log(a === b);

使用闭包也能够实现,如下:

function Singleton(name) {
  this.name = name;
}
// 原型扩展类的一个方法getName()
Singleton.prototype.getName = function() {
  console.log(this.name)
};
// 获取类的实例
Singleton.getInstance = (function() {
  var instance = null;
  return function(name) {
      if(!this.instance) {
          this.instance = new Singleton(name);
      }
      return this.instance
  }        
})();

// 获取对象1
const a = Singleton.getInstance('a');
// 获取对象2
const b = Singleton.getInstance('b');
// 进行比较
console.log(a === b);

也可以将上述的方法稍作修改,变成构造函数的形式,如下:

// 单例构造函数
function CreateSingleton (name) {
  this.name = name;
  this.getName();
};

// 获取实例的名字
CreateSingleton.prototype.getName = function() {
  console.log(this.name)
};
// 单例对象
const Singleton = (function(){
  var instance;
  return function (name) {
      if(!instance) {
          instance = new CreateSingleton(name);
      }
      return instance;
  }
})();

// 创建实例对象1
const a = new Singleton('a');
// 创建实例对象2
const b = new Singleton('b');

console.log(a===b); // true

三、使用场景

在前端中,很多情况都是用到单例模式,例如页面存在一个模态框的时候,只有用户点击的时候才会创建,而不是加载完成之后再创建弹窗和隐藏,并且保证弹窗全局只有一个

可以先创建一个通常的获取对象的方法,如下:

const getSingle = function( fn ){
let result;
return function(){
  return result || ( result = fn .apply(this, arguments ) );
}
}; 

创建弹窗的代码如下:

const createLoginLayer = function(){
var div = document.createElement( 'div' );
div.innerHTML = '我是浮窗';
div.style.display = 'none';
document.body.appendChild( div );
return div;
}; 

const createSingleLoginLayer = getSingle( createLoginLayer ); 

document.getElementById( 'loginBtn' ).onclick = function(){
var loginLayer = createSingleLoginLayer();
loginLayer.style.display = 'block';
};

上述这种实现称为惰性单例,意图解决需要时才创建类实例对象

并且Vuexredux全局态管理库也应用单例模式的思想,如下图:

现在很多第三方库都是单例模式,多次引用只会使用同一个对象,如jquerylodashmoment...

参考文献

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      cps是什么单位 98年属相是什么 胃胀吃点什么药 tap是什么意思 床褥是什么
      希思黎属于什么档次 小孩子手脱皮是什么原因引起的 骂人是什么意思 耳鬓厮磨是什么意思 母亲o型父亲b型孩子是什么血型
      不疼不痒的红疹是什么 煎牛排用什么锅最好 一什么鱼塘 坦诚相待是什么意思 晨尿浑浊是什么原因
      日加个成念什么 国代是什么意思 口腔溃疡吃什么药 梦见中奖了预兆什么 植物的茎有什么作用
      鱼油什么人不能吃bysq.com 发粉是什么hcv8jop9ns9r.cn 土耳其说什么语言weuuu.com 脉搏是什么意思hcv9jop4ns7r.cn 吃什么尿酸高hcv8jop5ns7r.cn
      火碱是什么东西bjhyzcsm.com 鼻涕有血丝是什么原因hcv9jop0ns6r.cn 虹膜是什么hcv9jop6ns2r.cn 痛什么什么痛inbungee.com 鼻炎不能吃什么食物mmeoe.com
      什么是功能性子宫出血hcv7jop7ns2r.cn 怀孕吃什么水果最好hcv9jop6ns7r.cn 山豆念什么hcv9jop3ns8r.cn 尿频尿急尿不尽吃什么药效果最好hcv8jop8ns2r.cn 冬虫夏草补什么hcv9jop7ns0r.cn
      煮玉米放盐起什么作用chuanglingweilai.com 补牙用什么材料最好hcv7jop9ns1r.cn 血瘀吃什么中成药hcv9jop3ns4r.cn 发烧呕吐是什么原因hcv9jop2ns9r.cn hg是什么单位hcv8jop5ns6r.cn
      百度