单例模式也称作为单子模式,更多的也叫做单体模式。为软件设计中较为简单但是最为常用的一种设计模式。
下面是维基百科对单例模式的介绍:
在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为。比如在整个系统的配
置文件中,配置数据有一个单例对象进行统一读取和修改,其他对象需要配置数据的时候也统一通过该单例对象来获取配置数据,这样就可以简化复杂环境下的配置
管理。
单例模式的思路是:一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance
名称)。那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回。同时将
该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例。
对于 JS 来说,巨大的灵活性使得其可以有多种方式实现单例模式,使用闭包方式来模拟私有数据,按照其思路可得:
1 var single = (function(){ 2 var unique; 3 4 function getInstance(){ 5 if( unique === undefined ){ 6 unique = new Construct(); 7 } 8 return unique; 9 } 10 11 function Construct(){ 12 // ... 生成单例的构造函数的代码 13 } 14 15 return { 16 getInstance : getInstance 17 } 18 })();
闭包方式
对于大着 灵活 牌子的JS来说,任何问题都能找到 n 种答案,只不过让我自己去掂量孰优孰劣而已,下面就简单的举几个使用闭包实现单例模式的方法,无非也就是将创建了的单例缓存而已。
1 var single = (function(){ 2 var unique; 3 function Construct(){ 4 // ... 生成单例的构造函数的代码 5 } 6 7 unique = new Constuct(); 8 9 return unique; 10 })();
我的Demo
1 // 单例模式 2 3 var totalScore = (function(){ 4 5 // 构造函数 6 var scoreConstruct = function(args){ 7 var args = args || {}; 8 this.score = args.score || 0; 9 this.shatterNumber = args.number || 1; 10 }; 11 12 // 实例容器 13 var instance; 14 15 // 获取实例的方法 16 // 返回Singleton的实例 17 var getInstance = function(args){ 18 if (instance === undefined){ 19 instance = new scoreConstruct(args); 20 } 21 return instance; 22 }; 23 24 // totalScore单例方法 25 var totalScoreMethod = { 26 27 // 增分数 28 addScore : function(args){ 29 if (instance !== undefined){ 30 instance.score = instance.score + args.score; 31 instance.shatterNumber = instance.shatterNumber + 1; 32 }else{ 33 instance = new scoreConstruct(); 34 } 35 }, 36 37 // 减分数 38 subScore : function(args){ 39 if (instance !== undefined){ 40 instance.score = instance.score - args.score; 41 instance.shatterNumber = instance.shatterNumber + 1; 42 }else{ 43 instance = new scoreConstruct(); 44 } 45 }, 46 } 47 48 return { 49 getInstance : getInstance, 50 totalScoreMethod : totalScoreMethod 51 } 52 53 })()