javascript 模式(2)——单例模式

单聊模式是一种非常极端的模式,它保证了一个类在整个应用程序域中只有一个实体,意味着当你多次创建某一个类的实例的时候它们都是第一次创建的那个。

在Java或c#环境实现单例模式很简单,只需要定义静态变量即可,将对象存入静态变量中即可,静态变量不会随类实例而变换。同理在javascript也是类似实现原理。

公共静态变量实现单例模式

var Earth = (function () {
    if (typeof Earth.instance === ‘object‘) {
        return Earth.instance;
    }
    this.name = "地球";
    this.age = 46 * 1000 * 1000 * 10000;
    Earth.instance = this;
    return Earth.instance;
});

代码中的Earth.instance 即为公共静态变量,在实例化的对象earth1中是看不见公共静态变量

但在Earth类中是可以看见的

var earth1 = new Earth();
var earth2 = new Earth();

console.log(earth1 === earth2);

由于是单例模式因此结果显然为‘true’

私有静态变量实现单例模式

将实例存储至公有变量中很简单,但有一个致命问题公共变量可以在外部被更改,因此最好的方式还是使用私有静态变量,使用私有静态变量需要通过及时函数和闭包来实现。

var Earth = (function () {
    var instance;
    return function () {
        if (typeof instance === ‘object‘) {
            return instance;
        }
        this.name = "地球";
        this.age = 46 * 1000 * 1000 * 10000;
        instance = this;
        return instance;
    }
}());

整个函数返回一个闭包函数,并且立即执行,及时函数表达方式:(function(){}())

再次执行

var earth1 = new Earth();
var earth2 = new Earth();

console.log(earth1 === earth2);

得到结果依然为’true’

总结:

单例模式是非常极端模式,可通过静态变量存储实例的方式来实现,通过私有静态的实现需要依靠于及时函数和闭包,关于及时函数和闭包就不再这里累赘了。

时间: 2024-08-01 10:53:20

javascript 模式(2)——单例模式的相关文章

Javascript模式(一) 单例模式

function A(){ // 存储实例对象 var instance; // 重写构造函数,只返回闭包内的局部变量instance A = function(){ return instance; } // 重写原型为实例本身 之后定义在原型上的属性和方法会直接赋在该实例上 A.prototype = this; // 实例化 instance = new A(); // 重写构造函数 instance.constructor = A; // 第一次实例化时返回重写之后的构造函数的实例 re

【javascript设计模式】构造器模式、模块模式、单例模式

构造器模式(Constructor) 构造器模式是学习js最早接触的一种,实现主要如下: 1 function myObject(name){ 2 this.name = name; 3 } 4 5 myObect.propotype = function sayName(){ 6 alert(this.name); 7 } 使用的时候需要new一个对象. 1 var myObj = new myObject('hello'); 2 myObj.sayName(); 模块模式(Module) 模

javascript 模式方面的学习

看了好多网上的文章,基本上得到一个结论:一些写类工具函数或框架的写类方式本质上都是 构造函数+原型 1.用构造函数来定义类属性(字段).2.用原型方式来定义类的方法. 具体文章请参阅 JavaScript的写类方式(1) http://www.cnblogs.com/snandy/archive/2011/03/06/1971764.html 一.下面我们看一下单例模式 (1.)这个网站对单例模式是什么描述的 (http://www.codingserf.com/index.php/2015/0

IOS设计模式之一(MVC模式,单例模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么翻译错误,请与我联系谢谢. iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不会太关注它. 在软件设计领域,设计模式是对通用问题

Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)

Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工作,以达到本地和Java的统一,但是就这点而言就相当的消耗资源,所以就Java程序员需要不断的去优化自己的代码.今天所研究的单例模式就是在这样的条件下产生的, 所谓单例模式,就是只有一个实例,在堆里面只有一个.假如我们的实例,就需要一个,但是会多次用到,这样的话就会出现很尴尬的问题. 比如: Win

JavaScript模式 --- 札记

全局变量的问题 创建隐式全局变量的反模式是带有var声明的链式赋值.在下面的代码片段中, a 是局部变量, b 是全局变量,这也许并不是你想要的 function foo(){ var a = b = 0; //var a window.b; // ....}//造成上面的原因是源于从右至左的操作符优先级.首先,优先级较高的是表达式 b=0, 此时b未声明.表达式的返回值为0,它被赋给 var 声明的局部变量 a. /* 建议这样做 */ function foo(){ var a, b; //

JavaScript模式

<JavaScript模式>一书看完一半了,越发感慨要精通JavaScript并非一夕一朝之事.先不说设计模式,就说JS的模块模式你真正掌握了么?这是成为一名架构师必备的基础.只是看书是很难掌握这些模式的灵活运用,需要实战,大量的实战.去什么地方实战呢,业务代码是很少有机会进行这个层面的实战的.思考了一些时日,这种实战最好的方法是研究相关的源码,underscore.js,sea.js,jQuery.js,vue.js,后两者都是近万行的代码量,先暂时不去研究,前两者是千行的代码量,可以放在今

工厂模式,单例模式

工厂模式: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ConsoleApplication1{ 设计模式:工厂模式,单例模式 <大话设计模式> 计算器 class JiSuanQi { private int a; public int A { get { return a; } set { a

java23种模式之单例模式

JAVA23种设计模式四--单例模式 单例模式是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 什么是单例模式? 一个类有且仅有一个实例,并且自行实例化向整个系统提供. 也就是说,在整个程序空间中,该类只存在一个实例对象. GoF对单例模式的定义: 保证一个类,只有一个实例存在,同时提供能对该实例