javascript设计模式-单体模式
场景:假设有一个Girl(美女)实体,该实体拥有姓名、年龄两个属性,拥有显示姓名和洗澡两个方法,下面分步骤构造该实体。
1、用简单基本单体模式:
var Girl1 = { name:"昭君", age:33, showName:function(){ alert("我的名字是:" + this.name); }, bathe:function(){ console.log("我是" + this.name + ",我在洗澡!"); } } console.log("Girl.age=" +Girl1.age); Girl1.bathe();
问题:美女的名字和洗澡这么隐私的是不能随便被访问的吧,那就要用到(私用成员的单体)
//使用下划线表示法
1 var Girl2 = { 2 name:"昭君", 3 _age:33, 4 showName:function(){ 5 console.log("我的名字是:" + this.name); 6 }, 7 _bathe:function(){ 8 console.log("我是" + this.name + ",我在洗澡!"); 9 } 10 } 11 console.log("Girl2.name=" +Girl2.name);//Girl3.name=昭君 12 console.log("Girl2.age=" +Girl2.age); //Girl.age=undefined 13 Girl2.showName();//我的名字是:昭君 14 Girl2.bathe();//Uncaught TypeError: Gird2.bathe is not a function
问题:如果我很猥琐,在洗澡的方法前面加一个下横线,那不是偷窥成功了吗?快使用闭包吧
1 //使用闭包 2 var Gird3 = (function(){ 3 var age = 33; 4 function bathe(){ 5 console.log("我是" + this.name + ",我在洗澡!"); 6 } 7 return { 8 name:"昭君", 9 showName:function(){ 10 console.log("我的名字是:" + this.name); 11 } 12 } 13 })(); 14 console.log("Girl3.name=" +Gird3.name);//Girl3.name=昭君 15 console.log("Girl3.age=" +Gird3.age); //Girl.age=undefined 16 Gird3.showName();//我的名字是:昭君 17 Gird3.bathe();//Uncaught TypeError: Gird3.bathe is not a function
结果:完美
但是,美女是用来怜惜的,没事儿的时候可别随便拿出来秀哟,那我们就用惰性加载吧!!!
1 //惰性实例化 2 var Gird4 = (function(){ 3 var girl = null; 4 function constructor(){ 5 var age = 33; 6 function bathe(){ 7 console.log("我是" + this.name + ",我在洗澡!"); 8 } 9 return { 10 name:"昭君", 11 showName:function(){ 12 console.log("我的名字是:" + this.name); 13 } 14 } 15 } 16 return { 17 getInstance:function(){ 18 if(girl) return girl; 19 return constructor(); 20 } 21 } 22 23 })(); 24 Gird4.getInstance().showName();