原生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 绘制 sin 曲线过程附图
Aug 21 Javascript
以Python代码实例展示kNN算法的实际运用
Oct 26 Javascript
webpack中引用jquery的简单实现
Jun 08 Javascript
基于JavaScript实现添加到购物车效果附源码下载
Aug 22 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
Apr 27 jQuery
Vue项目中添加锁屏功能实现思路
Jun 29 Javascript
5分钟学会Vue动画效果(小结)
Jul 21 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 Javascript
Javascript 对象(object)合并操作实例分析
Jul 30 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 Javascript
JS实现简单省市二级联动
Nov 27 Javascript
如何在 Vue 表单中处理图片
Jan 26 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 array_key_exists() 与 isset() 的区别
2016/10/24 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
python字符串常用方法
2018/06/14 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
python如何调用java类
2020/07/05 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
介绍一下常见的木马种类
2014/11/15 面试题
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
询价采购方案
2014/06/09 职场文书
镇班子对照检查材料思想汇报
2014/09/24 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
golang中字符串MD5生成方式总结
2021/07/04 Golang