原生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 相关文章推荐
js Html结构转字符串形式显示代码
Nov 15 Javascript
jQuery 自定义函数写法分享
Mar 30 Javascript
jquery实现input输入框实时输入触发事件代码
Jan 28 Javascript
js实现字符串的16进制编码不加密
Apr 25 Javascript
js实现select组件的选择输入过滤代码
Oct 14 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
Ajax与服务器(JSON)通信实例代码
Nov 05 Javascript
Node.js 数据加密传输浅析
Nov 16 Javascript
3种vue路由传参的基本模式
Feb 22 Javascript
vue.js数据绑定操作详解
Apr 23 Javascript
vue单页缓存方案分析及实现
Sep 25 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
Jul 31 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
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
简单实用的全选反选按钮例子
2013/10/18 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
jQuery设置Cookie及删除Cookie实例分析
2016/04/15 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
基于Vue单文件组件详解
2017/09/15 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
JS图片预加载三种实现方法解析
2020/05/08 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
python中的变量如何开辟内存
2018/06/26 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
关于python 跨域处理方式详解
2020/03/28 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
自动化专业个人求职信范文
2013/11/29 职场文书
初一地理教学反思
2014/01/16 职场文书
运动会解说词100字
2014/01/31 职场文书
小学班主任寄语大全
2014/04/04 职场文书
工程安全生产协议书
2014/11/21 职场文书
Python中requests库的用法详解
2022/06/05 Python
mysql幻读详解实例以及解决办法
2022/06/16 MySQL