资讯专栏INFORMATION COLUMN

【学习设计模式】通用的单例包装器

ormsf / 1347人阅读

摘要:代码示例代码中创建了一个单例的包装器,使用的示例代码如下因为是单例,因此,我们可以把对象的方法直接放在上,而不用放在的对象上。我们可以使用一个单例池来保存不同构造器的单例,用来标识是否为该构造器生成单例,并作为下标索引获取该单例。

1. 简介

Singleton(单例)模式的理解要从两个方面

它限制了类的实例化次数只能为一次,即在该实例不存在的情况下,可以通过一个方法创建对象实例,如果实例已经存在,则返回该对象的引用。

它不同于静态类(对象),单例可以推迟初始化,这一点很重要,因为可以推迟初始化,就意味着不用过早地为单例分配内存资源,而是可以当需要使用时,才对其进行初始化,分配对应的内存空间。

单例的存在,在一些时候并不是好事,可能它的出现时因为系统中的模块要么是系统紧密耦合,要么是其逻辑过分分散。

2. 代码示例
var singleton = (function () {
    var instance;
    return {
        getInstance : function (factory){
            var args = Array.prototype.slice.call(arguments, 1);
            if(!instance){
                instance = {};
                factory.apply(instance, args);
            }
            return instance;
        }
    }
})();

代码中创建了一个单例的包装器,使用的示例代码如下

function Person(name, age){
    this.name = name;
    this.age = age;
    this.sayName = function () {
        console.log(this.name);
    }
}
var p1 = singleton.getInstance(Person, "zhang", 25);
var p2 = singleton.getInstance(Person);
console.log(p1 == p2); // true
console.log(p2.sayName()); // "zhang"

因为是单例,因此,我们可以把对象的方法直接放在this上,而不用放在Person的prototype对象上。但是这段代码还有不足,那就是只能产生一个构造器的单例,我们可以来对其进行改进。

var singleton = (function () {
    var instances = [],
        guid = 0;
    return {
        getInstance : function (factory){
            var args = Array.prototype.slice.call(arguments, 1);
            if(typeof factory._guid == "undefined"){ 
                instances[guid] = {};
                factory.apply(instances[guid], args);
                factory._guid = guid++;
            }
            return instances[factory._guid];
        }
    }
})();

我们可以使用一个单例池(instances)来保存不同构造器的单例,用_guid来标识是否为该构造器生成单例,并作为下标索引获取该单例。使用示例:

function Person(name, age){
    this.name = name;
    this.age = age;
    this.sayName = function () {
        console.log(this.name);
    }
}

var p1 = singleton.getInstance(Person, "zhang", 25);
var p2 = singleton.getInstance(Person);
console.log(p1 == p2); // true
console.log(p2.sayName()); // "zhang"

function Car(brand){
    this.brand = brand;
    this.sayBrand = function () {
        console.log(this.brand);
    }
}

var c1 = singleton.getInstance(Car, "benchi");
var c2 = singleton.getInstance(Car);
console.log(c1 == c2); // true
console.log(c2.sayBrand()); // "benchi"

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91082.html

相关文章

  • 详解Spring中的9种设计模式「记得收藏」

    摘要:简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。中的就是简单工厂模式的体现,根据传入一个唯一的标识来获得对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。中的就是典型的工厂方法模式。 showImg(https://segmentfault.com/img/bVbwbd9?w=640&h=492); 一. 简单工厂又叫做静态工厂方法(...

    Dean 评论0 收藏0
  • 再遇设计模式之JavaScript篇

    摘要:在面向对象的语言中,比如,等,单例模式通常是定义类时将构造函数设为,保证对象不能在外部被出来,同时给类定义一个静态的方法,用来获取或者创建这个唯一的实例。 万事开头难,作为正经历菜鸟赛季的前端player,已经忘记第一次告诉自己要写一些东西出来是多久以的事情了。。。如果,你也和我一样,那就像我一样,从现在开始,从看到这篇文章开始,打开电脑,敲下你的第一篇文章(或者任何形式的文字)吧。 ...

    Clect 评论0 收藏0
  • JavaScript设计模式----单例模式

    摘要:不符合设计模式中的单一职责的概念。引入代理实现单例模式引入代理实现单例模式的特点我们负责管理单例的逻辑移到了代理类中。的单例模式对比在以上的代码中实现的单例模式都混入了传统面向对象语言的特点。 声明:这个系列为阅读《JavaScript设计模式与开发实践》 ----曾探@著一书的读书笔记 1.单例模式的特点和定义 保证一个类仅有一个实例,并且提供一个访问它的全局访问点。 2.传统面向对...

    selfimpr 评论0 收藏0
  • 这些Spring中的设计模式,你都知道吗?

    摘要:简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。中的就是简单工厂模式的体现,根据传入一个唯一的标识来获得对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪...

    LeviDing 评论0 收藏0

发表评论

0条评论

ormsf

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<