zoukankan      html  css  js  c++  java
  • JavaScript设计模式学习之单例模式

    一、单例模式介绍

                    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
    -----百度百科

    单例模式实现思路:
                 单例模式的实现原理是在singleton模式下,如果该实例不存在,可以通过一个方法创建一个类来实现创建类的新实例,如果实例已经存在,它会返回该对象的引用

    二、单例模式的JavaScript实现


    标准实现方法:
    /*singleton Pattern 单例模式经典实现*/
    var singleton = (function(){
    //实例保持一个singleton的引用
    var instance;
    function init(){
    //私有变量
    function privateMethod() {
    console.log("i am private method");
    }
    
    
    var privateName = "Gabriel chen";
    var privateAge  =  "21";
    var random = Math.random();
    return {
    //公有变量和方法
    publicHobby : "coding javascript",
    publicFriend : "chrome",
    publicGetAge : function(){return privateAge},
    getRandom : function(){ return random}
    };
    
    
    };
    
    
    return {
    //single实现原理,检查singleton实例,存在返回,不存在新建
    getInstance : function(){
    if(!instance){
    instance = init();
    }
    return instance;
    }
    }
    //立即调用初始化
    })()
    
    
    var s1= singleton.getInstance();
    var s2 =  singleton.getInstance();
    console.log(s1.getRandom()===s2.getRandom());

                   

    实现方法二:闭包方式
    var single = (function(){
    
        var unique;
    
        function Construct(){
    
            // ... 生成单例的构造函数的代码
            //私有变量
            var privateName = "陈";
            var random = Math.random();
            //公有方法和变量
            this.name = "chen";
            this.age="21";
            
            this.getPri =function(){return privateName};
            this.getRandom =function(){return random};
        }
    
    
    
        unique = new Construct();
    
    
    
        return unique;
    
    })(); 
    var s1 = single;
    var s2 = single ;
    s1.name = "siming" ;
    console.log(s2.getRandom()===s1.getRandom())


    三、单例模式的应用场景



    //网站计数器
    
    var  myCounter = (function(){
    	var counter;
    	function init(){
    		var  count = 0;
    		this.addCount=function(){
    			count=count+1;
    		};
    		this.getCount = function(){
    			return count;
    		};
    
    		return this;
    	}
    
    	return {
    		getCounter : function(){
    			if (!counter) {
    			counter = init();
    		    }
    		    return counter;
    		}
    		
    	}
    })();
    var c = myCounter.getCounter();
    c.addCount();
    c.addCount();
    var b = myCounter.getCounter();
    b.getCount();




  • 相关阅读:
    linux系统命令学习系列-用户切换命令su,sudo
    linux系统命令学习系列-用户组管理
    linux系统命令学习-用户管理
    python web开发-flask中sqlalchemy的使用
    python web开发-flask连接sqlite数据库
    python实现bt种子 torrent转magnet
    prefProvider.kt
    douyin-bot-代码
    pyadb关于python操作adb的资料
    bottle源码
  • 原文地址:https://www.cnblogs.com/gabrielchen/p/5055303.html
Copyright © 2011-2022 走看看