JavaScript 设计模式

设计模式和垃圾回收

一、设计模式

1、设计模式介绍

设计模式是面向对象中反复多次出现的问题,而总结出来的最优解决方案。

例如:我们使用字面量方式创建对象,容易造成重复,这个在应用过程中是不可避免的,为了解决这个问题,我们通过一个函数来解决重复,也就是工厂函数。此时就可以把这套方案叫做工厂模式。

不同的问题,总结出的方案也是不同的。在当前的实际应用过程中,人们总结了23种设计模式。常见的设计模式有:

  • 单例模式
  • 组合模式
  • 观察者模式
  • 发布订阅模式
  • 命令模式
  • 代理模式
  • 工厂模式
  • 策略模式
  • 适配器模式

2、单例模式

单例模式是指,通过一个类衍生出的对象,只能有一个,不会有第二个,就算有第二个,跟第一个是共享同一个堆地址的。

单例模式解决的问题是,当我们多次调用一个类中方法的时候,通常需要实例化多次,然后调用方法。但其实每次使用的方法有一个类就已经能用了,实例化多次,得到的多个实例化对象,造成了内存浪费,所以需要单例模式:

class Single{
   }

将一个类放在全局,不可避免的,就会被实例化多次,所以,放在全局不能实现单例模式。

function fn() {
   
    class Single{
   }
    var s = new Single()
    return s
}

放在局部,每次调用函数,会重新实例化类得到新的s变量,跟放在全局的效果是一样的。如何确保多次调用函数,在使用同一个s变量 - 闭包:

function fn() {
   
    class Single{
   }
    var s
    return function() {
   
        if(!s) {
   
        	 s = new Single  
        }
        return s
    }
}
var fun = fn()
var s1 = fun()
var s2 = fun()
console.log(s1 === s2) // true

此时创建对象只能通过调用fn中的返回函数,且多次调用使用的是同一个数据s。

但fn在全局是可以被调用多次的,每次调用都会创建一个独立的不会销毁的执行空间,也就是会得到多个不同的小函数,调用不同的小函数得到的对象也是独属于不销毁的执行空间的,还是会有不同:

function fn() {
   
    class Single{
   }
    var s
    return function() {
   
        if(!s) {
   
        	 s = new Single  
        }
        return s
    }
}
var fun = fn()
var s1 = fun()
var ff = fn()
var s2 = ff()
console.log(s1 === s2) // false

为了保证fn只能被调用一次,将fn作为自调用函数:

var fun = (function() {
   
    class Single{
   }
    var s
    return function() {
   
        if(!s) {
   
        	 s = new Single  
        }
        return s
    }
})()
var s1 = fun()
var s2 = fun()
console.log(s1 === s2) // true

此时创建对象只能调用fun,且每次调用共用同一个s变量,这样就形成了最终的单例模式。

3、组合模式

组合模式指的是,每个面向对象效果,在开启的时候,都需要先实例化对象&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值