《javascript设计模式》读书笔记四(单利模式)

1.单利模式简介

在《设计模式》中单利模式是一种比较简单的模式,定义如下:

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

在javascript中则将代码组织为一个单元,这个逻辑单元可以通过一个单一的变量访问,确保这个对象只存在一份实例。

单体类在javascript中可以用来划分命名空间、减少网页中全局变量的数目。

小结:其实就是把所有的代码封装到一个类中,访问时就通过这个类访问。好比生活中常见的电视遥控。把所需要的操作都封装到遥控上,访问电视时,直接通过遥控操作即可。

2.基本结构

我们平时用到的对象字面量就是所谓的单利模式,因为它把一批相关的属性和方法组织到了一起。

<span style="font-family:SimSun;font-size:18px;"> //通过对象字面量的形式来为对象创建属性和方法
        var Singleton = {
            attribute1: true,
            attribute2: 10,

            //方法一
            method1: function () {

            },
            //方法二
            method2: function (arg) {

            }
        };
        //修改对象属性
        Singleton.attribute1 = false;
        var total = Singleton.attribute2 + 5;
        //读取对象方法
        var result = Singleton.method1();</span>

在上述代码中,所有的变量和方法必须通过Singleton对象来访问,你也可以扩充这个对象。当然这也违背了《设计模式》中的开闭原则,如果真要包含一些私有变量的话,可以采用函数嵌套,也就是闭包的操作。

3.划分命名空间

正如单体对象的定义所示:所有单体对象的内部成员都被包装在这个单体对象中,并且这些成员只能通过这些单体对象变量来进行访问。所以我们平常所用的命名空间就可以达到这个效果。

<span style="font-family:SimSun;font-size:18px;"> //定义一个全局对象
        //定义一个公司的全局对象
        var Business = {

        };
        //然后可以分门别类地把自己的代码组织到这个全局对象的各个对象单体中
        //公司的管理部
        Business.Adminstration = {
         //方法一
            method1: function () {

            }

        };
        //公司的运作部
        Business.Operation = {
            //方法二
            method2: function () {

            }
        };
        //公司的广告部
        Business.advertisement = {
            //方法三
            method3: function () {

            }
        };

        Business.Adminstration.method(); //正确调用
        var a = new Business();  //not a constructor
        a.Adminstration.method();  //error</span>

通过把处理不同的代码分门别类的做一下规划处理,放到不同的命名空间中,这样就会减少程序的错误。正如上述代码所示,首先建立一个公司的全局对象,然后分门别类的把各个部分划分开,职责划分清晰,减少了对象间的联系,减少了出错的可能性。

4.使用闭包

在前面的博客中曾经提到有关闭包的概念。在闭包中,把变量和函数定义在构造函数内使他们成为私用成员,并且还定义了一个类似于特权的函数,用来达到外部可以访问这些私有成员的目的,但是我们知道使用闭包实例化类的时候,所有生命在构造函数内的方法和属性都会再次创建一份,这也是闭包的不利处所在。

因为单体只会被实例化一次,所以你不必担心自己在构造函数内声明了多少方法和属性,因为所有的方法和属性都只会被实例化一次。

<span style="font-family:SimSun;font-size:18px;"> <script>
        MyNamespace.Singleton = (function() {
            // 私有成员
            var privateAttribute1 = false;
            var privateAttribute2 = [1, 2, 3];

            function privateMethod1() {

            }
            function privateMethod2(args) {

            }
            //闭包
            return {
                publicAttribute1: true,
                publicAttribute2: 10,

                publicMethod1: function() {

                },
                publicMethod2: function(args) {

                }
            };
        })();
    </script></span>

通过单体加闭包的操作就可以访问到对象内部的私有变量了。

5.延迟实例化

由于单体对象都是在脚本加载的时候被创建出来的,如果我们在加载的时候,并不需要单体,那么我们又该如何操作来推迟单体对象的加载呢?

其实我们只要在其中加入一个静态的方法,用来声明什么时候调用即可。

<span style="font-family:SimSun;font-size:18px;"> <script>

        /* 单体对象 */

        MyNamespace.Singleton = (function() {

            var uniqueInstance; // Private attribute that holds the single instance.

            function constructor() { // 具体的代码细节

            }

            return {
                /*用来实现延迟加载*/
                getInstance: function() {
                    if(!uniqueInstance) { // 判断仅且只有一个单体对象
                        uniqueInstance = constructor();
                    }
                    return uniqueInstance;
                }
            }
        })();

    </script></span>

其实与上述相比,主要的操作就是多了一个静态的方法,用来实现判断和延迟加载。

6.小结

本篇博客主要讲解了单体模式在javascript中的应用,通过运用javascript模式,可以对代码进行组织,把相关的方法和属性组织在一个不被实例化多次的单体中,以方便我们以后的维护。这就是单体模式的好处。

如果还想对单体模式有更多了解的话,请详见一下博客。

单例模式

时间: 2024-08-02 06:58:19

《javascript设计模式》读书笔记四(单利模式)的相关文章

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

JavaScript设计模式:读书笔记(未完)

该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/3/30: 模式是一种可复用的解决方案,可用于解决软件设计中遇到的常见问题./将解决问题的方法制作成模板,并且这些模板可应用于多种不同的情况.有效模式的附加要求:适合性,实用性,适用性. 模式的优点: 防止局部问题引起大问题,模式让我们的代码更有组织性 模式通常是通用的解决方式,不管我们开发哪种应用程序,都可以用模式优化我们代码的结构 模式确实可以让我们避免代码复用,使代码更

head first 设计模式读书笔记 之 策略模式

作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php加入了面向对象的阵型之后,很多开发者开始使用了oop思想来写代码,php也变得越来越标准,越来越规范.而其中,设计模式起到了不小的作用.最近老大找我谈话,说php这边的开发模块耦合度过高,代码感觉质量不高,想来一次代码重构行动.我对代码重构也是一知半解,而代码重构的基础就是去了解设计模式,于是我翻起

大话设计模式读书笔记--8.外观模式

外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为 生活中的例子: 一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计 定义 定义: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这一接口使得这一子系统更加容易使用 结构图 Facade: 是模式的核心,指导所有子系统的功能, 可根据客户端的需求定制功能组合 SubSystemOne: 实现子系统

设计模式读书笔记——行为型模式

1. chain of responsibility 职责链 使用: · 有多个对象可以处理一个请求, 而具体由哪个对象处理请求需要在运行时刻自动确定. · 可以处理一个请求的对象集合应被动态指定 原理: 在链上的每个对象都有一致的处理请求的接口, 和访问链上后继者的接口. 从链上的第一个对象开始,要么亲自处理他,要么转发给链中的下一个候选者. 提交请求的客户并不明确知道哪一个对象会处理他,提交请求的可以并不直接引用最终响应他的对象. 实现:class HelpHandler /////////

大话设计模式读书笔记--12.状态模式

定义 状态模式定义: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来改变了其类 消除庞大的条件分支,将特定状态的行为放入一个对象中 生活中:开灯和关灯是两个状态 模式结构 Context: 上下文环境,维护一个状态实例,定义当前的状态 State: 抽象状态类,定义一个接口,封装与Context的一个特定状态相关的行为 ConcreteState:具体状态.实现Context的一个特定状态相关的行为 代码实现 场景: 12店之前是休闲状态, 之后是忙碌状态 点击下载代码 特点及使用场

大话设计模式读书笔记--23.访问者模式

定义 访问者模式定义: 表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下,定义作用于这些元素的新操作 把数据结构, 和作用于数据结构上的操作,分离 模式结构 代码实现 场景: 男人和女人谈恋爱,男人的状态和女人的状态 代码实现:点击下载 特点和使用场景 优点:很容易增加新的操作 缺点: 使增加新的数据结构变得困难 使用场景: 数据结构相对稳定的系统

大话设计模式读书笔记--6.原型模式

简单的复制粘贴极有可能造成重复代码的灾难, 但是java中提供了克隆的功能, 如果一个对象创建过程复杂,又要频繁使用, 在初始化信息不发生变化的情况下,应当采取克隆而不是new一个对象 定义 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 也就是说, 只需知道原型对象的类型,就可以拷贝, 拷贝分为浅拷贝和深拷贝,可参考浅拷贝和深拷贝 模式结构 Prototype: 抽象原型类,声明克隆接口 ConcretePrototypeA: 具体的原型类, 实现克隆操作 模式实现

大话设计模式读书笔记--18.命令模式

定义 命令模式定义: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作 比如: 吃烤串时, 客人点烤羊肉,烤鸡肉, 服务员记录下客人的点餐记录,然后通知厨师开始做 烤羊肉,烤鸡肉是请求对象;服务员是命令请求者;厨师是命令实现者 命令模式将功能(请求)封装成对象 目的 对命令请求者(Invoker)和命令实现者(Receiver)的解耦,方便对命令进行各种控制. 模式结构 代码实现 场景: 去饭店吃烤串 代码: 点击下载 特点和使用场

大话设计模式读书笔记--7.模板方法模式

有时候,我们会遇到由一系列步骤构成的过程,这个过程从高层次上看是相同的,但有些步骤的实现可能不同,我们就要考虑使用模板方法 生活中的例子:坐交通工具上班,  A开车,B做公交, 交通工具就是一个抽象模板 定义 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类不改变算法的结构,即可重定义该算法的某些特定步骤 模式结构 AbstractClass:是一个抽象模板类,templateMethod()是模板方法,它是一个顶级逻辑的骨架,primitiveOperation()是一个