持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
前情提要
- 对于软件设计模式中的单例模式和工厂模式,相信大家并不陌生。因为这是23个设计模式中最容易理解的了。上一篇的职责链模式理解起来可能有一点点难度。今天咱们就来一篇比较容易理解的。
- 对于什么是设计模式,在上一篇的职责链模式已经有明确的介绍。在这里就不进行过多的赘述了。
什么是单例模式?
- 所谓单例模式,顾名思义,无论你调用多少次,只要我检测到该实例已经存在,那么便不会再理会你的调用请求
- 一般情况下如果是单独封装一个方法的话会与闭包结合使用,因为需要在多次调用中去访问同一个标志性变量,否则无法做到检测是否该方法已经被使用。
- 当然如果你声明一个全局的变量来作为标志性变量也是可以的。
什么是工厂模式?
- 所谓工厂模式,顾名思义,就像工厂的流水线一样,每次调用都返回相同的对象。只要你发起了调用请求,我就返回给你一个对象。与单例模式刚好相反。
实际中的应用
- 单例模式
- 引用实践之节流函数
- 节流函数的思想:在设定的时间内多次触发只会响应第一次。
function throttle(fn, wait=500) { // 声明一个标志性变量 let timer; return function() { // 如果标志性变量为真,也就意味当前有实例正在运行,将不会理会当前的请求 if (timer) return; // 当标志性变量为假,则说明当前没有正在运行的实例,则应用当前的实例。 timer = setTimeout(() => { fn.call(this, ...arguments); timer = null; }, wait) } } - 节流函数相信大家是再熟悉不过的方法了,在实际开发中很常用,上面只是举了一个使用定时器实现节流的方式。从代码中可以看到timer便是标志性变量。假如我们在规定的时间内调用了100次,那么只会有第一次被成功记录并执行。之后的99次都会被遗弃。
- 工厂模式
- 引用实践之上篇文章中实现职责链模式时创建的Recharge类。当然文章是使用的是es6中的类。除此之外我们还可以使用es5的函数方法来实现。
function Recharge(fn) { this.fn = fn; this.next = null; } Recharge.prototype.setNextFn = function(fn) { this.next = fn; } Recharge.prototype.start = function(money) { const result = this.fn(money) if (result === 'next') { this.next.start(money) } } const recharge_1000 = new Recharge(xxx) - 上面的代码只是一个简写,具体的可以去查看该篇文章。
- 从上面的简写代码中可以看到每当我们创建实例化一次Recharge,都会返回给我们一个对象,该对象的原型上有两个方法。
- 引用实践之上篇文章中实现职责链模式时创建的Recharge类。当然文章是使用的是es6中的类。除此之外我们还可以使用es5的函数方法来实现。
总结
在23种设计模式中工厂模式和单例模式算是最常用到的了,也是最为大家所熟知的