首页 > Web开发 > 详细

Js设计模式之单例模式

时间:2019-07-29 14:04:55      阅读:85      评论:0      收藏:0      [点我收藏+]

单例就是保证一个类只有一个实例,实现方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回.
单例模式的思路:
一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance 名称)。
那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回
同时将该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例
var SingletonTester = (function(){
// 构造器函数
function Singleton(options){
options = options || {};
this.name = ‘SingletonTester‘;
this.pointX = options.pointX || 6;
this.pointY = options.pointY || 10;
}
// 缓存单例的变量
var instance;
// 静态变量和方法
var _static = {
name: ‘SingletonTester‘,
getInstance: function(options) {
if (instance === undefined) {
instance = new Singleton(options);
}
return instance;
}
};
return _static;
})();
var singletonTest = SingletonTester.getInstance({
pointX: 5,
pointY: 5
})
var singletonTest1 = SingletonTester.getInstance({
pointX: 10,
pointY: 10
})
singletonTest === singletonTest1 // true
1.Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),
想想看,是不是呢,你能打开两个windows task manager吗?
2.windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例
3.应用程序的日志应用,一般都用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,
因为只能有一个实例去操作,否则内容不好追加
4.Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源
5.数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,
这种效率上的损耗还是非常昂贵的,用单例模式来维护,就可以大大降低这种损耗
6.多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制
7.操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统
8.HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,
所有的HttpModule都共享一个HttpApplication实例
单例模式应用的场景一般发现在以下条件下:
  (1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
  (2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

作者:网易考拉前端团队
链接:https://juejin.im/post/59df4f74f265da430f311909
来源:掘金
单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
实现的方法为先判断实例存在与否,如果存在则直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。
适用场景:一个单一对象。比如:弹窗,无论点击多少次,弹窗只应该被创建一次。
class CreateUser {
constructor(name) {
this.name = name;
this.getName();
}
getName() {
return this.name;
}
}
// 代理实现单例模式
var ProxyMode = (function() {
var instance = null;
return function(name) {
if(!instance) {
instance = new CreateUser(name);
}
return instance;
}
})();
// 测试单体模式的实例
var a = new ProxyMode("aaa");
var b = new ProxyMode("bbb");
// 因为单体模式是只实例化一次,所以下面的实例是相等的
console.log(a === b); //true

Js设计模式之单例模式

原文:https://www.cnblogs.com/yuyezhizhi/p/11262849.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!