原生javascript单例模式的应用实例分析


Posted in Javascript onFebruary 23, 2020

本文实例讲述了原生javascript单例模式的应用。分享给大家供大家参考,具体如下:

总体原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有 的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升 级。 1、单一职责原则 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就 应该把类拆分。

创建模式_单例模式  某个类只允许创建一个实例,这就是单例模式。优点如下: 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建 多个的话,系统完全乱了。(比如:中国国家主席只有一个,飞机大战的 地图对象只有一个),所以只有使用单例模式,才能保证核心交易服务器 独立控制整个流程。

应用:

飞机大战中的地图只能有一个实例;  遮罩层有可能是某个项目中经常要频繁创建的实例,如果不停地创建和删除,还是 很浪费资源。应该,在首次使用时创建,以后只是使用首次创建的实例  放大镜有可能在某个项目中经常要频繁地创建的实例,也是很浪费资源。

单例模式的基础应用

<script>
let singleton = function (){
  function Map(width,height) {
    this.width = width;
    this.height = height;
  }
  let instance;
  return{
    getIntence : function(width,height){
      if(instance == undefined){
        instance = new Map(width,height);
      }else{
        instance.width = width;
        instance.height = height;
      }
      return instance;
    }
  }
}();
let m1 = singleton.getIntence(100,200);
let m2 = singleton.getIntence(200,300);
console.log(m1);//200 300
console.log(m2);//200 300
</script>

飞机大战中单例模式的应用

地图部分

let mapSingleton = (function(){
  function Map(width,height,background){
    this.domObj = null;//地图的div
    this.moveBox = null;
    this.width = width;
    this.height = height;
    this.background = background;  
    this.enemyPlanes = [];//敌机数组
    this.myPlanes = [];//我方战机数组
    this.createUI();
    this.moveBg();
  }
  //853 600
  Map.prototype.createUI = function() {
    //1、地图的div
    this.domObj = document.createElement("div");
    this.domObj.style.cssText = `margin:20px auto;position: relative;width:${this.width}px;height:${this.height}px;overflow:hidden`;
    document.body.appendChild(this.domObj);
    //2、移动的div
    this.moveBox = document.createElement("div");
    this.moveBox.style.cssText = `position: absolute;
          top:-1106px;
          width: 480px;
          height: 1706px;`;
    this.domObj.appendChild(this.moveBox);        
    //3、图片
    for(var i=0;i<2;i++){
      let img01 = document.createElement("img");
      img01.src = this.background;
      img01.style.cssText = `display: block`;
      this.moveBox.appendChild(img01);
    }
    //4、积分板:
    this.scoreDom = document.createElement("div");
    this.scoreDom.style.cssText = "position:absolute;left:0px;top:0px;width:100px;height:35px;z-index:999";
    this.scoreDom.innerHTML = 0;
    this.domObj.appendChild(this.scoreDom);
  };
  Map.prototype.moveBg = function(){
    let top1 = -1106;
    setInterval(()=>{
      top1++;
      if(top1>=-253){
        top1 = -1106;
      }
      this.moveBox.style.top = top1+"px";
    },50);
  }
  var instance;
  return {
    getInstance:function(width,height,background){
      if(instance==undefined){
        instance = new Map(width,height,background);
      }else{
        instance.width = width;
        instance.height = height;
        instance.background = background;
        instance.domObj.style.width=this.width+"px";
        instance.domObj.style.height=this.height+"px";
        instance.moveBox.children[0].src=this.background;
        instance.moveBox.children[1].src=this.background;
      }
      return instance;
    }
  }
})();
// 单例模式的总结
/*采用闭包原理和自调用原理,先进行自调用噶、返回闭包函数,让使用者调用,但只能创建一个实例对象,当要创建多个的时候 不会进行创建,最上面简单案例代码,如果要再次创建实例,会覆盖之前的数据,并且不会创建实例对象
为什么要采用闭包 防止使用者再次构造新对象 采用自调用之后 函数执行1次 在调用时 只需要使用return的函数就行 避免用户多次构造新对象*/

感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.3water.com/code/WebCodeRun测试上述代码运行效果。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 学习笔记(十二) dom
Jan 21 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
Apr 01 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
Jul 09 Javascript
window.open 以post方式传递参数示例代码
Feb 27 Javascript
js获取微信版本号的方法
May 12 Javascript
JavaScript动态添加css样式和script标签
Jul 19 Javascript
js实现带简单弹性运动的导航条
Feb 22 Javascript
Vue 实现列表动态添加和删除的两种方法小结
Sep 07 Javascript
新手快速上手webpack4打包工具的使用详解
Jan 28 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
小程序websocket心跳库(websocket-heartbeat-miniprogram)
Feb 23 #Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 #Javascript
深入理解webpack process.env.NODE_ENV配置
Feb 23 #Javascript
微信小程序实现限制用户转发功能的实例代码
Feb 22 #Javascript
vue.js实现简单的计算器功能
Feb 22 #Javascript
Vue.js实现立体计算器
Feb 22 #Javascript
vue实现计算器功能
Feb 22 #Javascript
You might like
php 用sock技术发送邮件的函数
2007/07/21 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
Python中decorator使用实例
2015/04/14 Python
Python psutil模块简单使用实例
2015/04/28 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
Django框架封装外部函数示例
2019/05/28 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
python实现复制文件到指定目录
2019/10/16 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
python开发入门——列表生成式
2020/09/03 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
美国知名的百货清仓店:Neiman Marcus Last Call
2016/08/03 全球购物
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
简历里的自我评价
2014/01/31 职场文书
法定代表人授权委托书
2014/09/19 职场文书
个人先进事迹材料
2014/12/29 职场文书
统计工作个人总结
2015/03/03 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
任命书格式范文
2015/09/22 职场文书
教师教育心得体会
2016/01/19 职场文书
文书工作总结(范文)
2019/07/11 职场文书