博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【学习设计模式】通用的单例包装器
阅读量:6850 次
发布时间:2019-06-26

本文共 2067 字,大约阅读时间需要 6 分钟。

1. 简介

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

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

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

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

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); // trueconsole.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); // trueconsole.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); // trueconsole.log(c2.sayBrand()); // "benchi"

转载地址:http://ndgul.baihongyu.com/

你可能感兴趣的文章
彻底弄懂Activity四大启动模式
查看>>
UNIX网络编程——epoll 的accept , read, write(重要)
查看>>
void及void指针含义的深刻解析
查看>>
50. Spring Boot日志升级篇—log4j【从零开始学Spring Boot】
查看>>
测试学习方向
查看>>
linux下安装python3
查看>>
数据结构绪论
查看>>
将博客搬至CSDN
查看>>
C#判断本地系统的网络连接状态
查看>>
F# 入门(二):安装和使用
查看>>
渗透测试流程
查看>>
C++学习笔记 -- 虚析构函数与纯虚析构函数
查看>>
Oracle中的日期函数
查看>>
01_对象的创建方法
查看>>
one-shot 检测算法YOLO、SSD
查看>>
ansible 提示安装sshpass
查看>>
常用SQL语句
查看>>
Linux网络编程必看书籍推荐
查看>>
GitHub在windows上代码管理教程
查看>>
Android 异步处理
查看>>