• 入门设计模式——单例模式


    参考文章:

    http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html


    单例模式:保证一个类只有一个实例,实现方法是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,确保一个类只有一个实例对象。

    在javascript里,单例作为一个命名空间提供者,从全局命名空间里提供了一个唯一的访问点来访问该对象。

    java中的单例模式是 :私有化构造方法了,所以只能有一个实例对象,也就是单例。

    自我感受:单例模式是在内部实例化了一次对象A,然后返回这个实例instance,所以在外部再new一个对象A的时候,得到的就是这个对象A的实例instance;

    相当于将所有在外部实例化A的对象的都是instance的引用; 对的,就是引用,指针指向同一个内存区域,所以不管是instance ,还是通过new A()new出来的对象a,b,c,d....它们中任意一个,做出任何改变,都会影响其他人,因为它们共用一个内存区域嘛!!

    可以把外部new出来的对象,其实可以看成是一个人,只是用的不同的名字而已啦!

     接下来就来阐释一下单例模式的实现方法:

     (1)最简单的方法:对象字面量的方法

    var Singleton = (function () {
    var instantiated;
    function init() {
    /*这里定义单例代码*/
    return {
    publicMethod: function () {
    console.log('hello world');
    },
    publicProperty: 'test'
    };
    }

    return {
    getInstance: function () {
    if (!instantiated) { //确保只有一个实例
    instantiated = init(); //使用init方法,是使publicMethod和publicP                        roperty只在要使用的时候才初始化;
    }
    return instantiated;
    }
    };
    })();

    /*调用公有的方法来获取实例:*/
    Singleton.getInstance().publicMethod();

    果然是最简单的,因为最好理解

    (2)方法二:利用this

    (this是执行上下文中的一个属性。执行上下文是一个对象,它的属性包括VO:变量对象和this:thisValue)

      this与上下文中可执行代码的类型有直接关系,this值在进入上下文时确定,并且在上下文运行期间永久不变。

     关于this的详解参考:http://www.cnblogs.com/TomXu/archive/2012/01/17/2310479.html#3364439

    function Universe() {
    
        // 判断是否存在实例
        if (typeof Universe.instance === 'object') {
            return Universe.instance;
        }
    
        // 其它内容
        this.start_time = 0;
        this.bang = "Big";
    
        // 缓存
        Universe.instance = this;
    
        // 隐式返回this
    }
    // 测试
    var uni = new Universe();
    var uni2 = new Universe();
    console.log(uni === uni2); // true
    uni.v = 'test';
    uni2.v ; //'test' ;证明了共享同一个命名空间

    这个方法有点不理解 

    (3)方法三:重写构造函数

    function Universe() {
    
        // 缓存的实例
        var instance = this;
    
        // 其它内容
        this.start_time = 0;
        this.bang = "Big";
    
        // 重写构造函数
        Universe = function () {
            return instance;
        };
    }
    

    (4)方法四:

    function Universe() {
    
        // 缓存实例
        var instance;
    
        // 重新构造函数
        Universe = function Universe() {
            return instance;
        };
    
        // 后期处理原型属性
        Universe.prototype = this;
    
        // 实例
        instance = new Universe();
    
        // 重设构造函数指针
        instance.constructor = Universe;
    
        // 其它功能
        instance.start_time = 0;
        instance.bang = "Big";
    
        return instance;
    }
    

    (5)方法五:

    var Universe;
    
    (function () {
    
        var instance;
    
        Universe = function Universe() {
    
            if (instance) {
                return instance;
            }
    
            instance = this;
    
            // 其它内容
            this.start_time = 0;
            this.bang = "Big";
        };
    } ());
    

      

      

     

      

  • 相关阅读:
    深入理解JavaScript闭包
    冒泡排序
    Objective-C中的self和super
    IOS中UIKit——UIButton的背景图像无法正常显示的原因
    IOS绘图——简单三角形
    NSDateFormatter中时间格式串的含义
    IOS屏幕布局
    IOS学习感想
    WWDC————苹果全球开发者大会
    刚开始学IOS遇到的类和方法
  • 原文地址:https://www.cnblogs.com/shixiaomiao/p/5212122.html
Copyright © 2020-2023  润新知