设计模式之----单体(单例)模式

设计模式之—-单体(单例)模式


1、介绍

从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现。OK,正式开始。

在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。


2、 简单单体与闭包单体

在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法:

<!DOCTYPE html>
<html>
<head>
    <meta name="name" content="content" charset="utf-8">
    <title>javascript单体模式</title>
</head>
<body>
    <script>
    //单体模式(sigleton)--无法new();因为他已经真是存在了

    /*1、简单单体--对象自变量的模式*/
/*  var Sigleton ={
       attr1 : true,
       attr2 : 10,
       method1: function(){
       alert("我是方法1");
},
method2 : function(){
    alert("我是方法2");
}
    };
    alert(Sigleton.attr1);

    //单体模式主要是划分命名空间,区分不同人之间的代码
    var BHX =BHX || {};
    BHX.Sigleton ={
        attr1 : true,
attr2 : 10,
method1: function(){
alert("我是方法1");
},
method2 : function(){
    alert("我是方法2");
}
    };
    BHX.Sigleton.method1();*/

    /*2、闭包单体---借用闭包穿简单体(闭包的主要目的:保护数据)*/
    //命名空间--块级作用域的实现

 /*     (function test(){
            alert(11);
        })()*/

    var BHX = BHX || {};
    BHX.Sigleton2=(function(){
    //用闭包的作用就是把自己的私有属性给封装起来,不让外界访问。只有return暴露出来才能访问。
        var a1 = true;
        var a2 = 10;
        var f1 = function(){
            alert("function f1");
        };
        var f2 = function(){
            alert("function f2");
        };

        //要把块级作用域的东西赋值给Sigleton2,要有return语句。
        return{
            attr1 : true,
    attr2 : 10,
    method1: function(){
    return f1();
    },
    method2 : function(){
        return f2;
    }

    };

    })();

    alert(BHX.Sigleton2.attr1);
    BHX.Sigleton2.method1();

    </script>
</body>
</html>

上面的代码很不错了,但如果我们想做到只有在使用的时候才初始化,那该如何做呢?为了节约资源的目的,我们可以另外一个构造函数里来初始化这些代码,如下:

3、 惰性单体和分支单体

<!DOCTYPE html>
<html>
<head>
    <title>javascript 单体模式2</title>
</head>
<body>
<script>
    /*3、惰性单体---(和闭包单体有一些相似的地方)但是可以用变量来控制要返回那些内容,而不是所有的都返回,这样在大项目中很有好处*/
    //命名空间
    var BHX = BHX || {};
    BHX.Base =(function(){

        //利用私有变量控制 返回的单体对象
        var uniqueInstance; //undefined

        //需要一个构造器init 初试化对象的方法
        function init(){
            var a1 = true;
            var a2 = 10;
            var f1 = function(){
                alert("function f1");
            };
            var f2 = function(){
                alert("function f2");
            };

            return{
                attr1 : true,
                attr2 : 10,
                method1: function(){
                    return f1();
                },
                method2 : function(){
                    return f2;
                }

            };
        };

        return {
            getInstance:function(){
                if (!uniqueInstance) { //如果不存在,则创建单体实例
                    uniqueInstance =init();
                };
                return uniqueInstance;
            }

        };
    })();

    //BHX.Base.getInstance().method1();

    /*4、分支单体--和swich  if else类似,可以用于底层框架浏览器的差异性检测*/

    var Ext =Ext ||{};
    var diff = true;

    Ext.More =(function(){
        var ObjA={          //火狐浏览器
            //属性1
            attr1:"火狐属性1"
            //属性2
            //方法1
            //方法2
        };
        var ObjB={
            //属性1
            attr1:"IE属性1"
            //属性2
            //方法1
            //方法2
        };
        return (diff)? ObjA : ObjB;
    })();
    alert(Ext.More.attr1);

</script>
</body>
</html>

知道了单例如何实现了,但单例用在什么样的场景比较好呢?其实单例一般是用在系统间各种模式的通信协调上,下面的代码是一个单例的最佳实践:

4、 最佳实践

var SingletonTester = (function () {

    //参数:传递给单例的一个参数集合
    function Singleton(args) {

        //设置args变量为接收的参数或者为空(如果没有提供的话)
        var args = args || {};
        //设置name参数
        this.name = ‘SingletonTester‘;
        //设置pointX的值
        this.pointX = args.pointX || 6; //从接收的参数里获取,或者设置为默认值
        //设置pointY的值
        this.pointY = args.pointY || 10;

    }

    //实例容器
    var instance;

    var _static = {
        name: ‘SingletonTester‘,

        //获取实例的方法
        //返回Singleton的实例
        getInstance: function (args) {
            if (instance === undefined) {
                instance = new Singleton(args);
            }
            return instance;
        }
    };
    return _static;
})();

var singletonTest = SingletonTester.getInstance({ pointX: 5 });
console.log(singletonTest.pointX); // 输出 5 

5、其他实现方式

参考可见博客:(http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 06:23:04

设计模式之----单体(单例)模式的相关文章

Java设计模式:Singleton(单例)模式

概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例模式主要是为了避免创建多个实例造成的资源浪费,以及多个实例多次调用容易导致结果出现不一致等问题.例如,一个系统只能有一个窗口管理器或文件系统,一个程序只需要一份全局配置信息. 应用场景 资源共享的情况下,避免由于资源操作时导致的性能或损耗等.如缓存.日志对象.应用配置. 控制资源的情况下,方便资源之

javascript设计模式-singleton(单例)模式

singleton(单例)模式被熟知的原因是因为它限制了类的实例化次数只能一次,单例模式,在该实例不存在的勤快下,可以通过一个方法创建一个类来实现创建类的新实例:如果实例已经存在,则会简单返回该对象的引用.单例模式不同于静态类(或对象),因为我们可以推迟它们的初始化,这通常是因为它需要一些信息,而这些信息在初始化期间可能无法获取,对于没有察觉到之前的引用代码,它们不会提供方便检索方法,这是因为它既不是对象,也不是由一个single返回的类,而是一个结构,在js中,singleton充当共享资源命

Java设计模式中的单例设计

/** * 单例设计模式 * 应用场合:只需要一个对象的 * 作用:保证整个应用程序中某个实例有且只有一个 * 类型有:饿汉模式.懒汉模式 * 下面的例子是一个饿汉模式的例子 */ class SingleDemo { // 1.将构造方法私有化,不允许外部直接创建使用 private SingleDemo() {} // 2.创建类的唯一实例,使用private static修饰 private static SingleDemo instance = new SingleDemo(); //

面试题集锦&amp;&amp;实现Singleton(单例)模式-JAVA版

题目:设计一个类,我们只能生产该类的一个实例.(来自<剑指Offer>) 解析:只能生产一个实例的类是实现Singleton(单例)模式的类型.由于设计模式在面向对象程序设计中起着举足轻重的作业,在面试过程中很多公司都喜欢问一些与设计模式相关的问题.在常用的模式中,Singleton是唯一一个能够用短短几十行代码完整实现的模式.因此,写一个Singleton的类型是一个很常见的面试题. 以下我们给出几种解法,供大家参考. *不好的解法一:只适用于单线程环境. 由于要求只能产生一个实例,因此我们

Singleton(单例)模式

Singleton(单例)模式用于确保某个类只有一个实例,并且为之提供一个全局访问点. Singleton模式适用情况: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时 在任何情况下,Singleton模式都建议我们提供能够访问单例对象的公有静态方法.如果使用这个方法创建一个对象,该方法将承担确保仅创建一个实例的责任. Singleton 定义一个Instance操作,允许客户访问它的唯一实例

【java设计模式】之 单例(Singleton)模式

1. 单例模式的定义 单例模式(Singleton Pattern)是一个比较简单的模式,其原始定义如下:Ensure a class has only one instance, and provide a global point of access to it. 即确保只有一个实例,而且自行实例化并向整个系统提供这个实例.单例模式的通用类如下图所示: Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中

[Java设计模式](一)怎样实现Singleton(单例)模式编程

单例模式是开发模式中最简单,最易于理解的一种模式.简单地说,它指的就是始终保持一个实例的意思.但是,Java的类是可以穿件多个实例的,那么,怎么实现呢? 顾名思义,单例模式就是只有一个实例.单例模式确保某一个类只有一个实例,这个类称为单例类,单例模式有3个要点: ①是某个类只能有一个实例: ②它必须自行创建这个实例: ③是它必须自行向整个系统提供这个实例.例如,一些资源管理器常常设计成单例模式. 在计算机系统中,需要管理的资源有很多,例如每台计算机可以有若干个打印机,但只能有一个打印控制器,以避

设计模式整理_单例设计模式

单例设计模式,它确保一个类只有一个实例,并提供一个全局访问点. 由于单例设计模式对应的类只能创建一个对象,因此它所对应的方法必须是static(不是static只有创建对象才能调用). 以下是单例模式的一个经典实现:采用了延迟加载对象的例子. public class Single1 { private static Single1 single; //利用一个静态变量来记录Single1的唯一实例,这里没有直接声明,采用了延迟加载模式. private Single1(){} //把构造器声明

从别人写的 Object-C 中 Singleton (单例) 模式 中的一些理解--备

关于 面向对象的设计模式 对于面向对象的设计模式,想必大家并不陌生吧. 纵观23种设计模式中,数单例模式(Singleton)和工厂模式(Factory Method)最为熟悉和基础吧.当然,本文总结Singleton模式,对于其他设计模式不做叙说. Singleton模式,即单例模式.顾名思义,主要用于做应用程序的资源共享控制.用途很多?? 实质为,单例是在程序声明周期里 有且仅有 被实例化过一次的类.为确保实例化的唯一,利用类的 类(static)方法来生成和访问对象. 至此,你便可以在程序

C++ Singleton (单例) 模式最优实现

参考:http://blog.yangyubo.com/2009/06/04/best-cpp-singleton-pattern/ 索引 静态化并不是单例 (Singleton) 模式 饿汉模式 懒汉模式 (堆栈-粗糙版) 懒汉模式 (局部静态变量-最佳版) 范例代码和注意事项 (最优实现) 扩展阅读 参考资料 我非常赞成合理的使用 设计模式 能让代码更容易理解和维护, 不过我自己除了简单的 单例 (Singleton) 模式 外, 其它都很少用 :-) 可耻的是, 直到前段时间拜读了 C++