博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript 设计模式之单体(Singleton)模式
阅读量:6826 次
发布时间:2019-06-26

本文共 2289 字,大约阅读时间需要 7 分钟。

hot3.png

单体模式介绍

    单体模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”

         javascript是一个没有类的程序语言,当然也可以去模拟面向对象语言的类式写法。对于javascript我们广义的去理解单体模式。

      javascript的单体模式可以带来哪些作用那?首先肯定是减少了全局变量数目,javascript的全局变量是该语言的糟糕特性之一,作为一个优秀的JS程序员一定要控制全局变量的使用。其次我们把一组相关的逻辑单元组织在一个单体中,用来划分命名空间,这样使得代码可读性更强更好维护。

    下面我们学习javascript的单体模式,我们以浏览器类型和版本为模型进行实例。

单体模式示例

简单的单体模式

最简单的单体模式实现,使用{}将相关属性方法组织起来。

var Browser = {type : 'Firefox',version : '3.6',getType : function(){return this.type;},getVersion : function(){return this.version;}};console.log(Browser.getType());console.log(Browser.getVersion());console.log(Browser.type);

我们已经实现了最简单是单体模式,但是此时的单体模式很脆弱,如果有人写下如下的代码,那么我们的单体就被破坏了。

var Browser = {type : 'Firefox',version : '3.6',getType : function(){return this.type;},getVersion : function(){return this.version;}};console.log(Browser.getType());console.log(Browser.getVersion());Browser.type = 'change';console.log(Browser.getType());console.log(Browser.getVersion());

此时的输出内容在的类型已经被改变掉了。我们的浏览器类型可以随意改变,这显然不行的了。我们需要使用私有成员来进行这个单体模式的变形。那么我们可以使用闭包来完成私有成员的处理。

使用闭包的单体模式

var Browser = (function(){  var type = 'Firefox';  var version = '3.6';  function _getType(){return type;}  function _getVersion(){return version;}  return {     getType:function(){return _getType();},     getVersion:function(){return _getVersion();}  }})();console.log(Browser.getType());console.log(Browser.getVersion());  console.log(Browser.type);

此时外面已经访问不到 Browser内部的类型与版本。下面我们继续升级,这次我们升级到只有使用的时候才去实例化Browser。

惰性实例化单体模式

var Browser = (function(){  var uniqueInstane;  function constructor(){      var type = 'Firefox';      var version = '3.6';      function _getType(){return type;}      function _getVersion(){return version;}      return {         getType:function(){return _getType();},         getVersion:function(){return _getVersion();}      }  }  return {      getInstance : function(){        if(!uniqueInstane){           console.log('instance init.');           uniqueInstane = constructor();        }        return uniqueInstane;      }  }})();console.log(Browser.getInstance().getType());console.log(Browser.getInstance().getVersion());

此时我们这次的单体模式的示例就算是完毕了。

单体模式总结

    上面我们示例了几种关于浏览器的单体模式示例。单体模式的好处在于对代码的组织,非常便于维护。结合闭包可以更好的对私有成员的操作。单体模式的弊端在于提供的是一种单点访问,可能导致模块间的强耦合。在选择这种模式的时候应该考虑到这种情况。最适合才是最好的。

转载于:https://my.oschina.net/xionghl/blog/221897

你可能感兴趣的文章
response.setContentType("text/html;charset=utf-8")后依然乱码的解决方法
查看>>
final、抽象类、接口、多态、
查看>>
Concurrency Managed Workqueue(一)workqueue基本概念
查看>>
合数分解为质数的乘积模板
查看>>
CefSharp支持flash
查看>>
2.求一个数组有最大和的子串和上升子序列问题,只写好这些经典问题才有用
查看>>
java jvm学习笔记七(jar包的代码认证和签名)
查看>>
构建之法阅读笔记
查看>>
使用eclipse 开发lisp
查看>>
图书馆管理系统——模板建立
查看>>
2017.6.26 工作记录
查看>>
“Too many open files” 小记
查看>>
tomcat报错
查看>>
【xamarin + MvvmCross 从零开始】八、Android Fragment 的使用
查看>>
TOJ 3046: 招商银行网络系统
查看>>
java8_api_正则表达式
查看>>
java匿名对象
查看>>
RichTextBox.MouseWheel事件控制父控件Panel的内容滚动
查看>>
php程序在浏览器哪里判断,一个判断PHP程序是否被同时在不同浏览器上执行的问题...
查看>>
php 获取5分钟前,php时间轴开发,即显示为“刚刚”、“5分钟前”、“昨天12:10...
查看>>