600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > -01-26 JS设计模式-单例模式:单例模式的原理和实现 懒汉模式和饿汉模式 单例模

-01-26 JS设计模式-单例模式:单例模式的原理和实现 懒汉模式和饿汉模式 单例模

时间:2019-02-02 13:33:20

相关推荐

-01-26 JS设计模式-单例模式:单例模式的原理和实现 懒汉模式和饿汉模式 单例模

文章目录

1.什么是单例模式?介绍特点结构2.如何实现一个单例模式?思路实现代码3.单例模式的优缺点4.懒汉模式和饿汉模式懒汉模式:一开始不会实例化,什么时候用才new出来实例化饿汉模式:一开始类加载时就实例化并创建单例对象懒汉模式和饿汉模式的对比5.单例模式的常见应用场景6.单例模式模拟登录框

1.什么是单例模式?

介绍

单例模式是最简单的设计模式之一,属于创建型模式,单例模式提供了一种创建对象的最佳方式

特点
单例模式的类(单例类)只有一个实例对象这个单例对象必须由单例类创建单例类对外提供一个访问这个单例的全局访问点

*总的来说就是,确保只有一个实例,并提供全局访问

结构

单例类:包含一个实例且能自行创建这个实例的类

访问类:使用单例的类

2.如何实现一个单例模式?

思路

通过单例模式的特点:一个类只有一个实例,

先判断实例存在与否,若存在,则直接返回若不存在,则创建了再返回

*在JS中单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象

实现代码

用一个变量来标记当前是否已经为某个类创建了这个单例对象,

若是,则在下一次获取实例时直接返回之前创建的对象

写法一:

let Singleton = function(name) {this.name = name;this.instance = null;};//Singleton.prototype.getName = function() {// alert(this.name);//};Singleton.getInstance = function(name) {if (!this.instance) {this.instance = new Singleton(name);}return this.instance;};let s1 = Singleton.getInstance("zhangsan");let s2 = Singleton.getInstance("lisi");console.log(s1 === s2); //true

写法二:

let Singleton = function(name) {this.name = name;this.instance = null;};//自执行函数+闭包Singleton.getInstance = (function(name) {var instance = null;return function(name) {if (!instance) {instance = new Singleton(name);}return instance;}})();

3.单例模式的优缺点

从上面的实例可以知道,单例模式全程只创建一个对象实例,这样就不用创建和销毁实例,但是却不能适用于动态拓展对象

优点:适用于单一对象,只生成一个对象实例,避免频繁创建和销毁实例,减少内存占用

缺点:不适用于动态扩展对象,或者需要创建多个相似对象的场景

4.懒汉模式和饿汉模式

懒汉模式:一开始不会实例化,什么时候用才new出来实例化

Singleton类被加载时,不会立即实例化==>等到第一次使用这个实例的时候再实例化

第一次调用getInstance时,才真正的实例化

饿汉模式:一开始类加载时就实例化并创建单例对象

"饿"是指:只要类被加载,实例就会立即创建==>实例创建时机比较早

只要类被加载,立即实例化Singleton实例,后续不论怎么操作,只要严格使用getInstance,就不会出现其他实例

懒汉模式和饿汉模式的对比

懒汉模式比饿汉模式效率更高:

懒汉模式中,若getInstance一直没有被调用,此时实例化的过程也就被省略掉了,又称"延时加载"它是通过"实例用不到"来达到节省实例化开销的目的

5.单例模式的常见应用场景

Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~网站的计数器,一般也是采用单例模式实现,否则难以同步。应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

单例模式应用的场景一般发现在以下条件下:(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如日志文件,应用配置。(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。

6.单例模式模拟登录框

// 单例模式模拟登录框class LoginForm {constructor() {this.state = "hide"}show() {if (this.state === "show") {alert("showing now!");return;}this.state = "show";console.log("登录框已经显示!");}hide() {if (this.state === "hide") {alert("hideing now!");return;}this.state = "hide";console.log("登录框已经隐藏!");}}LoginForm.getInstance = (function() {let instance = null;return function() {if (!instance) {instance = new LoginForm();}return instance;}})();var login1 = LoginForm.getInstance();var login2 = LoginForm.getInstance();console.log(login1 === login2);// 验证一// login1.show(); //登录框已经显示!// login2.hide(); //登录框已经隐藏!// 验证二login1.show(); //登录框已经显示!login2.show(); //弹窗:showing now!

-01-26 JS设计模式-单例模式:单例模式的原理和实现 懒汉模式和饿汉模式 单例模式实现登录框

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。