js设计模式(一)---单例模式

之前有写过但是感觉不是很透彻---重新来过

单例模式:

  定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。  

应用场景:

  如果一个对像只需要被创建一次的时候就需要单例模式,例如:线程池、全局缓存、浏览器中的widow对象等。

实现:

  使用一个变量记录是否为某个类已经创建了对象,如果是,则在下次获取该类实例的时候。直接返回之前创建的对象。

// 单例模式
var Singleton = function(name){
    this.name = name;
    this.instance = null;
};// 获取实例对象
function getInstance(name) {
    if(!this.instance) {   //一旦被实例化之后就不对其进行在实例化
        this.instance = new Singleton(name);
    }
    return this.instance;
}
// 测试单例模式的实例
var a = getInstance("aa");     --->aa
var b = getInstance("bb");     --->aaconsole.log(a === b)    //true

你会发现创建实例的逻辑和管理单例的逻辑放在了一起;这个不符合 “单一职责“  的原则

我们改进下 使用代理的方式使用单例模式

var Singleton = function(name) {
    this.name = name;
};

var getSingleton = (function() {
    var instance;
    return function(name) {
        if (!instance) {
            instance = new Singleton(name);
        }
        return instance;
    }
})();
var a = new getSingleton(‘aa‘);
var b = new getSingleton(‘bb‘);
console.log(a === b)  //true

虽然做了分离但是你会发现公共部分的代码还是存在

于是还而已改进为

var Singleton = function(name) {
    this.name = name;
};

var getSingle = function( fn ){
  var result;
  return function(){
    return result || ( result = fn .apply(this, arguments ) );
  }
};

var createSingle = getSingle(Singleton)
var a = createSingle(‘aa‘)
var b = createSingle(‘bb‘)

console.log(a == b)

如果你吧单例写到这种程度基本上也就差不多了

时间: 2024-10-08 21:16:22

js设计模式(一)---单例模式的相关文章

js设计模式之单例模式

关于设计模式,我的理解是它是业务代码的提前解决方案.意思就是说在没有真正的业务之前,设计模式就存在了,这个是显然的.设计模式是人长期从事业务总结的具有普通适用性的解决方案. 就个人来讲,写了太多的命令式编程代码,所谓命令式代码就是业务需要怎样就写怎么样的功能,比如添加一个点击事件,比如进行一个验证等扥.写就写了很少站在设计模式的角度或者前人的角度去改善代码. 不给自己找客观原因,最近开始关注设计模式,尝试从设计模式的角度改善开发. 在开始单例设计模式之前首先要搞清楚js之中的apply和call

理解js设计模式之单例模式

单例模式的定义:只提供唯一的一个实例来让你访问 js中单例是天然存在的: var a1={ hello:'js' } var a2={ hello:'js' } console.log(a1===a2) //false 任意生成的一个对象字面量其实就是一个对象而且他也是唯一的,对象字面量声明对象的方式,每次都会在对内存中创建一个新的空间,所以不管你对象里面的东西一不一样,他们就是不一样的(本质是地址不一样) 但是这样的单例是不可靠的,很容易被覆盖...你将a1,a2赋一个新的值,之前的单例对象就

js设计模式学习 --- 单例模式1

什么单例模式 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器中的window 对象等.在JavaScript 开发中,单例模式的用途同样非常广泛.试想一下,当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建. 实现单例模式 <script type="text/javascrip

JS 设计模式之单例模式

?一.概念: 一个类 仅有一个实例 提供一个访问它的全局访问点 ?二.实现: class SimpleOne { constructor (name) { this.name = name; } getName (propsName) { this.name = propsName; return typeof this.name; } } const a = new SimpleOne('a').getName(); const b = new SimpleOne('b').getName()

Js常用的设计模式(1)——单例模式

<Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言.每种语言都有天生的优缺点.一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些. 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬. 换到程序中, 静态语言里可能需要花很多功夫来实现装饰

【转】JS设计模式开篇

(原文地址:http://blog.chinaunix.net/uid-26672038-id-3904513.html) 本文主要讲述一下,什么是设计模式(Design pattern),作为敲键盘的我们要如何学习设计模式.设计模式真的是一把万能钥匙么? 各个代码的设计模式几乎每个人都知晓,就算不会那也一定在一些装逼的大牛(部分而已)口中听过.但可能很少有人知道设计模式的由来: 设计模式该术语源自Erich Gamma等人在上世纪90年代从建筑设计领域引入到计算机科学的(很难想象到底有多大关联

JS设计模式(一)

刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化.linux.数据库.服务器等的基础知识. 设计模式的学习主要参考<JavaScript设计模式与开发实践>一书,很多笔记也会从该书抄录.开始JS设计模式的学习. 1.原型模式 原型模式既是一种设计模式,也是一种编程泛型.原型模式是JS最基础的继承实现,在这儿就不多讲了,写一下JS原型继承的基本原

[JavaScript设计模式]惰性单例模式

惰性单例模式 之前介绍了JS中类的单例模式,这次我们讨论下单例模式的应用.在众多网站中,登录框的实现方式就是一个单例,点击一次就展示一次,所以我们可以在页面加载好的时候就创建一个登录框,点击页面上的登录按钮时,用于控制它的显示和隐藏. 代码实现: 登录 ``` --> 这样的问题就是,如果用户进来后所有的操作根本没有用到登录,那创建登录框这个操作就是无用的,所以改进为当用户点击登录按钮时才开始创建登录框,如下: 登录 ``` --> 现在达到了惰性的目的,但失去了单例的效果.每次点击登录都会创

JS设计模式入门和框架中的实践

JS设计模式入门和框架中的实践 在编写JS代码的过程中,运用一定的设计模式可以让我们的代码更加优雅.灵活. 下面笔者就结合诸如redux的subscribe.ES6的class.vue里面的$dispatch.jquery里面的on/off来给大家简单介绍下设计模式在这些库.语法和框架中的使用. 设计模式解决的问题 设计模式并不是很玄乎的知识,很多同学在编写JS代码的时候已经在不经意间用了不少设计模式了. 笔者认为把设计模式单独抽象出来探讨,就和算法中抽象出来冒泡.排序一样,是为了描述一种常用的

JS设计模式1-单例模式

单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如全局缓存,window对象.单例模式在js开发中单例模式的用途非常广泛,比如页面中有一个登录浮窗,无论单击多少次登录窗口,这个窗口只会创建一次,那么这个窗口就适合用单例模式来创建. 1.单例模式实例: 要实现单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次取该类实例的时候,之间返回之前创建的对象. 1 var Sign=function(name){ 2 this.name=name; 3 th