【设计模式】Javascript设计模式——单例模式

一、什么叫单例模式

​ 保证一个类仅有一个实例对象,并提供一个访问它的全局访问点.

二、有什么用

​ 创建完之后,只有一个实例,之后再怎么创建,都是这一个,方便实例管理,提供了对实例的受控访问。

​ 对于频繁创建,销毁对象,这个单例模式实现了对象统一,内存只占有一个对象内存分量,在频繁创建中,大大的节约了系统内存。

三、核心点

  1. 只有一个实例
  2. 全局可访问该实例
  3. 自行实例化(主动实例化)
  4. 可推迟初始化,即延迟执行(与静态类/对象的区别)

四、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不同得代码,实现方式多种多样,后续补充。

猜你喜欢

转载自www.cnblogs.com/alenghan/p/13207101.html