单例模式
一、什么是单例模式
保证一个类仅有一个实例对象,并提供一个访问它的全局访问点.
二、有什么用
创建完之后,只有一个实例,之后再怎么创建,都是这一个,方便实例管理,提供了对实例的受控访问。
对于频繁创建,销毁对象,这个单例模式实现了对象统一,内存只占有一个对象内存分量,在频繁创建中,大大的节约了系统内存。
三、核心点
- 只有一个实例
- 全局可访问该实例
- 自行实例化(主动实例化)
- 可推迟初始化,即延迟执行(与静态类/对象的区别)
四、Coding
//一个正常的普通对象
function Girlfriend(name, age) {
this.name = name;
this.age = age;
this.sayName = () => {
return `我叫${this.name},今年${this.age}岁`;
};
this.eat = (num) => {
return `我一天能吃${num}顿饭`;
};
}
//每次使用都需要去new一个girlfriend对象,然后调用对应的方法
let g1 = new Girlfriend("小倩", 23);
//调用对象的方法
console.log(g1.sayName());
console.log(g1.eat(3))
let g2 = new Girlfriend("小胖妞", 25);
//调用对象的方法
console.log(g2.sayName());
console.log(g2.eat(8))
//对比两个对象,不是一个对象
console.log(g1 === g2); // ==> false
//单例模式获取对象
let SingletonGirlfriend = (()=>{
//等待实例的对象
function Girlfriend(name, age){
this.name = name;
this.age = age;
this.sayName = () => {
return `我叫${this.name},今年${this.age}岁`;
};
this.eat = (num) => {
return `我一天能吃${num}顿饭`;
};
}
//这个就是最终的实例,利于闭包,缓存一个内部变量
var instance = null;
return {
getInstance:()=>{
if(!instance){
instance = new Girlfriend(`小倩`, 26);//固定的人,做谁的女朋友都叫小倩
//这里锁定属性不可修改
Object.freeze(instance);
//或使用defineProperty修改对象那个属性writable+configurable,防止篡改
Object.defineProperty(instance,`name`,{
value: `小倩`,
writable: false,
enumerable: true,
configurable: false
})
}
return instance;
}
}
})()
//这里直接获取实例对象
let g1 = SingletonGirlfriend.getInstance();
console.log(g1.sayName());//做谁的女朋友都叫小倩
console.log(g1.eat(3));//跟穷人一天吃3顿饭
let g2 = SingletonGirlfriend.getInstance();
console.log(g2.sayName());//做谁的女朋友都叫小倩
console.log(g2.eat(8));//跟富二代一天吃8顿
//对比两个对象,是一个对象
console.log(g1 === g2); // ==> true是同一个叫小倩的
五、小结
个人认为单例模式得目的很简单为了维护统一一个全局对象,实现得方式我觉得多种多样,利用闭包,立即执行函数,静态属性等都可以实现,根据具体得业务去Coding不同得代码,实现方式多种多样,后续补充。