一、工厂模式 factory function
理解:工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。
工厂模式是为了解决多个类似对象声明的问题;也就是为了解决实列化对象产生重复的问题。
优点:能解决多个相似的问题。
缺点:不能知道对象识别的问题(对象的类型不知道)。
function CreatePerson(name,age,sex) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sex = sex;
obj.sayName = function(){
return this.name;
}
return obj;
}
var p1 = new CreatePerson("longen",'28','男');
var p2 = new CreatePerson("tugenhua",'27','女');
console.log(p1.name); // longen
console.log(p1.age); // 28
console.log(p1.sex); // 男
console.log(p1.sayName()); // longen
console.log(p2.name); // tugenhua
console.log(p2.age); // 27
console.log(p2.sex); // 女
console.log(p2.sayName()); // tugenhua
// 返回都是object 无法识别对象的类型 不知道他们是哪个对象的实列
console.log(typeof p1); // object
console.log(typeof p2); // object
console.log(p1 instanceof Object); // true
二、单体模式
单体模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一变量进行访问。
什么是单体模式:就是划分一个命名空间,将一批属性和方法组织在一起的对象,如果可以实例化,只能被实例化一次。
单体模式的优点是:
- 可以用来划分命名空间,减少全局变量的数量。
- 使用单体模式可以使代码组织的更为一致,使代码容易阅读和维护。
- 可以被实例化,且实例化一次。
案例:
css:
*{margin:0;padding: 0;}
#btn{width: 80px;height: 40px;background: red;border: 2px red dashed;cursor:pointer;outline: none;margin: 100px auto;display: block;}
.sit{width: 100px;height: 100px;background: gray;text-align: center;line-height: 100px;color: red;position: absolute;left: 0;top: 0;right: 0;bottom: 0;margin: auto;}
html:
<button id="btn">点击开门</button>
js:
var obtn=document.getElementById("btn");
obtn.onclick=function(){
new Toast();
}
function Toast(){
this.init();
}
Toast.prototype.init=function(){
if(!Toast.obj){
Toast.obj={};
Toast.obj.div=document.createElement("div");
document.body.appendChild(Toast.obj.div);
Toast.obj.div.className="sit";
Toast.obj.div.innerHTML="开门成功";
clearTimeout(Toast.obj.timer);
Toast.obj.timer=setTimeout(()=>{
Toast.obj.div.style.display="none";
},1000)
}else{
Toast.obj.div.style.display="block";
clearTimeout(Toast.obj.timer);
Toast.obj.timer=setTimeout(()=>{
Toast.obj.div.style.display="none";
},1000)
}
}
三、模块模式
模块模式使用了一个返回对象的匿名函数。在这个匿名函数内部,先定义了私有变量和函数,供内部函数使用,然后将一个对象字面量作为函数的值返回,返回的对象字面量中只包含可以公开的属性和方法。这样的话,可以提供外部使用该方法;由于该返回对象中的公有方法是在匿名函数内部定义的,因此它可以访问内部的私有变量和函数。
我们什么时候使用模块模式:如果我们必须创建一个对象并以某些数据进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么我们这个时候就可以使用模块模式了。
注: 模块模式的思路是为单体模式添加私有变量和私有方法能够减少全局变量的使用
var singleMode = (function(){
// 创建私有变量
var privateNum = 112;
// 创建私有函数
function privateFunc(){
// 实现自己的业务逻辑代码 }
// 返回一个对象包含公有方法和属性
return {
publicMethod1: publicMethod1,
publicMethod2: publicMethod1
};
})();
// 创建私有变量
var privateNum = 112;
// 创建私有函数
function privateFunc(){
// 实现自己的业务逻辑代码 }
// 返回一个对象包含公有方法和属性
return {
publicMethod1: publicMethod1,
publicMethod2: publicMethod1
};
})();