原生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 相关文章推荐
jquery实现的鼠标拖动排序Li或Table
May 04 Javascript
jquery中one()方法的用法实例
Jan 16 Javascript
Javascript 高阶函数使用介绍
Jun 15 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
Oct 07 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
Dec 01 Javascript
JavaScript结合HTML DOM实现联动菜单
Apr 05 Javascript
关于Vue的路由权限管理的示例代码
Mar 06 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
Oct 16 Javascript
element-ui 本地化使用教程详解
Oct 28 Javascript
vue3为什么要用proxy替代defineProperty
Oct 19 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
vue 获取url参数、get参数返回数组的操作
Nov 12 Javascript
小程序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
星际争霸任务指南——神族
2020/03/04 星际争霸
PHP控制网页过期时间的代码
2008/09/28 PHP
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
7个Javascript地图脚本整理
2009/10/20 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
python encode和decode的妙用
2009/09/02 Python
python中format()函数的简单使用教程
2018/03/14 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
python生成requirements.txt的两种方法
2019/09/18 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
AOP的定义以及作用
2013/09/08 面试题
项目工作说明书
2014/07/29 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
服务整改报告
2014/11/06 职场文书
安全生产先进个人总结
2015/02/15 职场文书
施工安全保证书
2015/05/09 职场文书
幼儿园小班教学反思
2016/03/03 职场文书