单例模式

  • 一,单列模式的介绍
    • 1.概念
    • 2.示例场景
    • 3.UML 类图如下
  • 二,单例模式的应用
    • 1.模式特性的说明
      • 1-1. java实例
      • 1-2. `javaScript`的简单实例 - 存在不透明性
      • 1-3. 使用代码实现单例模式 - 完成一个透明的单例
      • 1-4. 通用的惰性单例
  • 三,单列模式的场景
    • 项目中的场景
    • 单例模式 vs 单一职责原则

一,单列模式的介绍

1.概念

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例;
单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2.示例场景

按照面向对象的编程思想,任何东西都可以抽象为一个类,然后可以new出若干个对象。
但是针对某些场景,只能存在唯一的对象;
例如:jQuery中的$; 登录;购物车等;

3.UML 类图如下

二,单例模式的应用

1.模式特性的说明

  • 单例模式需要使用到java的特性(private
  • ES6中并没有使用private的关键字;(暂时还没有规范到ES6中,但typeScript除外)

1-1. java实例

单例模式用到了 java 的一些特性,而 es6 没有这些特性,所有这里使用 java 进行演示,代码如下:

public class SingleObject {// 注意,私有化构造函数,外部不能 new ,只能内部能 new !!!!private SingleObject(){}// 唯一被 new 出来的对象private SingleObject instance = null;// 获取对象的唯一接口public SingleObject getInstance() {if (instance == null) {// 只 new 一次instance = new SingleObject();}return instance;}// 对象方法public void login(username, password){System.out.println("login...");}
}

使用代码

public class SingletonPatternDemo {public static void main(String[] args) {//不合法的构造函数//编译时错误:构造函数 SingleObject() 是不可见的 !!!//SingleObject object = new SingleObject();//获取唯一可用的对象SingleObject object = SingleObject.getInstance();object.login();}
}

单例模式的关键在于不能让外部使用者 new 出对象,即构造函数是 private

这里的关键字样表示:
public 公有的
protect 受保护
private 私有

1-2. javaScript的简单实例 - 存在不透明性

这里通过SingleObject.getInstance来获取SingleObject唯一的类,相对较简单,但存在一个问题;这个类的不透明性SingleObject使用者必须知道这是个单例类;
跟以往的 new XXX的方式获取不同,这里使用SingleObject.getInstance来获取对象;实例代码如下:

class SingleObject {login() {console.log('login...')}
}
SingleObject.getInstance = (function () {let instancereturn function () {if (!instance) {instance = new SingleObject();}return instance}
})()// 测试:注意这里只能使用静态函数 getInstance ,不能 new SingleObject() !!!
let obj1 = SingleObject.getInstance()
obj1.login()
let obj2 = SingleObject.getInstance()
obj2.login()
console.log(obj1 === obj2)  // 两者必须完全相等

1-3. 使用代码实现单例模式 - 完成一个透明的单例

这里使用到“单一职责的原则”,将创建对象对象的初始化方法进行分离;
这里把负责管理单例的逻辑移到了代理类ProxySingletonObject中,而实现单例的SingleObject变成一个普通的类,结合起来实现单例的效果;代码实例如下:

// 实例的构造函数
class SingleObject {login() {console.log('login...');}
}
// ProxySingletonObject 引入一个代理类
var ProxySingletonObject = (function(){ var instance;return function(){if (!instance){instance = new SingleObject();}return instance;}
})();
var login1 = new ProxySingletonObject()
var login2 = new ProxySingletonObject()
console.log(login1 === login2, "login1 === login2");

1-4. 通用的惰性单例

单列的逻辑:用一个变量来标志是否创建过对象,如已创建,下次直接返回已创建好的对象;

var obj;
if (!obj) {obj = XXX;
}

这里将创建实例对象的职责管理单列的职责分开;createLoginLayer的方法可用于创建多种,随时替换方法;

// 创建对象的实例:
var createLoginLayer = function(){var div = document.createElement( 'div' );div.innerHTML = '我是登录浮窗';div.style.display = 'none';document.body.appendChild( div );return div;
};
// 单列的逻辑
var getSingle = function(fn) {console.log(fn)var result;return function() {return result || (result = fn.apply(this, arguments))}
}
// 调用单列的逻辑创建createLoginLayer的单列
var createSingleLoginLayer = getSingle( createLoginLayer ); document.getElementById( 'loginBtn' ).onclick = function(){var loginLayer = createSingleLoginLayer(); // 登录框的createLoginLayer只有一个loginLayer.style.display = 'block';
};

三,单列模式的场景

常使用中,很多都用到了单例的思想,但是不一定完全按照单例的类图来实现:

项目中的场景

  • jQuery 只有一个 $
    在项目中应用jQuery的文件,有且只有一个$,其内部调整逻辑也类似:
// jQuery 只有一个 `$`
if (window.jQuery != null) {return window.jQuery
} else {// 初始化...
}
  • 模拟实现一个登录框
  • 购物车
  • redux 和 vuex 的 store

单例模式 vs 单一职责原则

  • 单一职责原则是针对所有的设计,单个功能尽量拆分,一个模块做好一个功能。如果做不好,会带来模块臃肿,不好维护。
  • 单例模式是系统的有且只有一份数据,如果不这样做,会出 bug ;(这里当我们写自己的模块时,进行封装使用引入到项目中,也可多一次创建就可使用;避免多次创建带来不必要的损耗)

设计原则验证:

  • 符合单一职责原则,只实例化唯一的对象
  • 没法具体开放封闭原则,但是绝对不违反开放封闭原则

js设计模式的讲解与应用 - 【单例模式】相关推荐

  1. JavaScript设计模式系统讲解与应用-笔记

    可参考:https://www.kancloud.cn/qeating/javascript-design/1555175 第1章 课程介绍 1.导学 设计模式:前端开发.客户端开发.后端开发=> ...

  2. js设计模式笔记小结

    JS 设计模式 面向对象 搭建开发环境 npm / webapck / webpack-dev-server / babel babel-core babel-loader babel-polyfil ...

  3. js observer 添加_简单了解4种JS设计模式

    阅读本文约需要5分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了15款有用前端开发的ST插件的知识,今天跟大家分享下4种 ...

  4. (一)导学(Javascript设计模式系统讲解与应用)

    导学 论工程师的设计能力 前端学习设计模式的困惑 课程概述 知识点介绍 课程安排 面向对象 设计原则 设计模式 综合示例 讲解方式 课程收获 学习前提 重点提示 论工程师的设计能力 3年工作经验,面试 ...

  5. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  6. [js]设计模式小结对原型的修改

    js设计模式小结 工厂模式/构造函数--减少重复- 创建对象有new- 自动创建obj,this赋值- 无return原型链模式 - 进一步去重类是函数数据类型,每个函数都有prototypecons ...

  7. Java设计模式之创建型:单例模式

    一.什么是单例模式: 单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例.单例模式的优点在于: 系统中只存在一个 ...

  8. JS设计模式之Module(模块)模式、Revealing Module(揭示模块)模式

    Module(模块)模式 概念 Module模式最初被定义为一种在传统软件工程中为类提供私有和共有封装的方法. 通过这种方式,能够使一个单独的对象拥有共有/私有方法和变量,从而屏蔽来自全局作用局的特殊 ...

  9. js设计模式——3.观察者模式

    js设计模式--观察者模式 /*js设计模式--.观察者模式*/// 主题,保存状态,状态变化之后触发所有观察者对象 class Subject {constructor() {this.state ...

  10. js 设计模式学习(1)

    最近一个人外出旅行 顺便在那座城市买了一本关于JS设计模式的书 供无聊的时候阅读 却发现小有收获 旅游回来以后立马写下心得 做了一个地图 并以此总结此次旅行的经过的地方 尝试1: 尝试写JS类 1 v ...

最新文章

  1. 关于使用JQ scrollTop方法进行滚动定位
  2. [转载] scala
  3. 5G加持!刘作虎确认一加7 Pro:屏幕成本是普通旗舰2倍
  4. 数据库三范式,轻松理解
  5. pyqt5快速开发与实战_用云开发快速制作客户业务需求收集小程序丨实战
  6. 怎样看mysql是不是支持SSL_mysql是如何支持ssl通信的?
  7. Qt总结之五:读写文件操作
  8. sumo学习——sumo的路网介绍
  9. iOS 页面切换控制
  10. 访问FTP站点下载文件,提示“当前的安全设置不允许从该位置下载文件”
  11. php 英文替换中文,php如何中英文符号替换?
  12. Excel2JSON Excel转JSON Excel另存为JSON的技巧
  13. 什么?内存不够了?进来教你malloc空间
  14. 计算机组网的有线传输媒介主要依赖,家庭无线局域网组建毕业论文
  15. 中国教育培训机构市场运营状况与投资咨询预测报告2022年版
  16. 太理同学APP——个人比较有成就感的作品吧!
  17. Remix使用教程,新版 remix 使用教程
  18. C++求圆的周长和面积
  19. 梦开始的地方----初识C语言(2)
  20. BRD、MRD 和 PRD

热门文章

  1. pytorch tensor索引、切片、连接——Indexing, Slicing, Joining
  2. IT项目失败的常见原因分析
  3. PT100热电阻简单介绍
  4. 如何用Camtasia制作简单动画?
  5. python环境下skimage处理高通道tif图片(10通道)
  6. tk域名管理后台_免费tk域名解析(教你免费顶级域名注册的方法)
  7. 三角形箭头向右的_css实现三角箭头
  8. 通过R访问世界银行数据(World Bank Data)分析经济
  9. 5G时代的到来对直播的影响
  10. MFQE 2.0: A New Approach for Multi-FrameQuality Enhancement on Compressed Video