单体模式

作者: 你期待的花开 | 来源:发表于2017-06-01 21:43 被阅读28次

单体模式:

单体模式用于创建命名空间,将一批关联的属性和方法组织成一个逻辑单元,减少全局变量。
逻辑单元中的代码通过单一的变量进行访问。

  • 一个单体对象由对象本身 和 访问这个对象的变量组成。此变量通常为全局变量,所以单体对象能在页面任何位置被访问,故此变量可看做单体对象内部属性和方法的一个命名空间。

特点:

  • 该类只有一个实例;
  • 该类自行创建该实例,即在该类内部创建自身的实例对象;
  • 向整个系统公开这个实例接口。

弊端:

耦合度高,不容易进行单元测试。

适合场合:

提供命名空间,增加代码模块性,分支功能。

应用

关于JavaScript的最头疼的事情之一是,它的变量没有特定的作用范围。 一般情况下,任何变量,函数,数组或对象都是全局性,这意味着在同一页上的其他脚本可以访问并覆盖它们。解决方法是把变量封装在一个匿名函数中。 例如,下面的定义将产生三个全局变量和和两个全局函数:

var name = 'Chris';
var age = '34';
var status = 'single';
function createMember(){
  // [...]
}
function getMemberDetails(){
  // [...]
} 

封装后如下:

var myApplication = function(){
var name = 'Chris';
var age = '34';
var status = 'single';
return{
  createMember:function(){
    // [...]
  },
  getMemberDetails:function(){
    // [...]
  }
}
}();

这被称为单体模式,是JavaScript设计模式的一种,改进的写法是:

  var myApplication = function(){
  var name = 'Chris';
  var age = '34';
  var status = 'single';
  function createMember(){
    // [...]
  }
  function getMemberDetails(){
    // [...]
  }
  return{
    create:createMember,
    get:getMemberDetails
  }
}();

利用分支技术来来封装浏览器之间的差异

注意的地方:
  1. 一定要用闭包,实现即时绑定;
  2. 每个分支之间用分号隔开;
  3. 最后返回的是分支的名字;
  4. 调用的时候用单体名+分支的方法名。
    // 利用单体的分支技术来定义XHR(XMLHttpRequest)对象,必须要用闭包才可以实现
    var XHR = (function () {
        var standard = {
            cXHR: function () {
                return new XMLHttpRequest();
            }
        };
        var activeXNew = {
            cXHR: function () {
                return new ActiveXObject('Msxml2.XMLHttp');
            }
        };
        var activeXOld = {
            cXHR: function () {
                return new ActiveXObject('Microsoft.XMLHttp');
            }
        };
        var testObject;
        try {
            testObject = standard.cXHR();
            return standard;
        } catch (e) {
            try {
                testObject = activeXNew.cXHR();
                return activeXNew;
            } catch (e) {
                try {
                    testObject = activeXOld.cXHR();
                    return activeXOld;
                } catch (e) {
                    throw new Error('Create the XMLHttpRequestObject failed!');
                }
            }
        }
    })();
    window.onload = function () {
        alert(XHR.cXHR());
    }

相关文章

  • JavaScript设计模式-单体模式

    你将了解一种设计模式-单体模式!你将了解单体模式的优点! 单体模式 单体模式的思想在于保证一个特定类仅有一个实例。...

  • 软件架构的演变:从 All in one 到 MA

    1. 单体架构 1.1 简单单体模式 1.2 MVC模式 1.3 前后端分离模式:C/S 1.4 前后端分离模式:...

  • Typescript 单体/单例模式

    标签: 前端 设计模式 单体模式 单例模式 typescript 如果下面的代码你能轻易阅读,那么你已经熟悉单体模...

  • JavaScript 中几个重要的工具函数

    实现原型继承的extend函数 单体模式通用函数 实现原型继承的extend函数 单体模式通用函数

  • 单体模式

    单体模式: 单体模式用于创建命名空间,将一批关联的属性和方法组织成一个逻辑单元,减少全局变量。逻辑单元中的代码通过...

  • js创建对象及工厂模式

    单体创建对象 工厂模式创建对象

  • 单体创建对象、工厂模式创建对象

    单体创建对象 工厂模式创建对象

  • JS设计模式之模块模式

    我们通过单体模式理解了是以对象字面量的方式来创建单体模式的;比如如下的对象字面量的方式代码如下: 模块模式的思路是...

  • JS 设计模式

    工厂模式 单体模式 模块模式 代理模式 职责链模式 命令模式 模板方法模式 策略模式 发布-订阅模式 中介者模式 ...

  • 模式:单体架构

    背景 你正在开发一个服务端的企业应用程序。它必须支持不同的客户端,包括桌面浏览器,移动端浏览器和原生手机应用。它需...

网友评论

本文标题:单体模式

本文链接:https://www.haomeiwen.com/subject/upxyfxtx.html