JS设计模式之单例模式
程序员文章站
2022-03-13 09:08:46
单例模式 单例模式的定义是:保证一个类只有一个实例,并提供一个访问它的全局访问点。比如说购物车,在一个商城中,我们只需要一个购物车,购物车在整个商城中是唯一的,不需要多次创建,即使多次点击购物车按钮,也不会生成多个购物车。 闭包预警:有对闭包不明白的同学,可以 "看这里" 。 让我们实现一个单例模式 ......
单例模式
单例模式的定义是:保证一个类只有一个实例,并提供一个访问它的全局访问点。比如说购物车,在一个商城中,我们只需要一个购物车,购物车在整个商城中是唯一的,不需要多次创建,即使多次点击购物车按钮,也不会生成多个购物车。
闭包预警:有对闭包不明白的同学,可以。
让我们实现一个单例模式吧
var singleton = function(name) { this.name = name; } singleton.getinstance = (function () { var instance = null; return function (name) { if (!instance) { instance = new singleton(name); } return instance; } })() var single1 = singleton.getinstance('张三'); var single2 = singleton.getinstance('李四'); console.log(single1 === single2); // 输出true
我们主要看一下singleton.getinstance
方法,其中将变量instance
作为一个标志,来确认是否创建过singleton
对象。如果没有就创建一个singleton
对象,反之则返回之前创建过的对象。
这样我们创建singleton
对象的时候,就得使用singleton.getinstance
方法,而不是使用new
关键字来创建对象。如果想使用new
关键字的话,可以这样写。
使用代理类来实现单例模式
var singleton = function(name) { this.name = name; } var proxysingleton = (function () { var instance = null; return function(name) { if (!instance) { instance = new singleton(name); } return instance; } })() var single1 = new proxysingleton('张三'); var single2 = new proxysingleton('李四'); console.log(single1 === single2); // 输出true
我们将管理单例的逻辑放入proxysingleton
这个代理类中,从而使singleton
变成一个普通的类或者构造函数。这样我们就可以通过new
关键字来创建对象。
创建对象和管理单例逻辑职责分离
var createobj = function(name, age) { return { name: name, age: age } } var getsingle = function(fn) { var instance = null; return function () { return instance || (instance = fn.apply(this, arguments)); } } var createfn = getsingle(createobj); var obj1 = createfn('张三', 18); var obj2 = createfn('李四', 19); console.log(obj1 === obj2); // 输出true
这里createobj
方法负责创建对象和处理内部逻辑,getsingle
方法只负责管理单例的逻辑。这样在创建各种单例对象的情况下,使用更加灵活。也符合单一职责的开发原则。
单例模式的使用场景
单例模式的使用场景非常广泛,这里举几个
上一篇: 可编辑且宽度自适应input
下一篇: QQ登录界面布局