单例模式介绍

系统中被唯一使用的,一个类只有一个实例

单例模式的思路是:

一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance 名称)。

那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回。

同时将该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例。

UML类图和代码示例

这里是根据Java代码画的UML类图,跟js的代码不一样但是思路是一样的

单例模式需要使用到Java的特性(private),在ES6中是没有这样修饰符的(typescript除外),所以只能使用Java代码来演示

在js中可以使用闭包来实现单例模式,但是没法将类的构造函数私有化,后面综合应用中会使用到模块化解决这个问题

class SingleObject {
login () {
console.log('login.....')
}
}
SingleObject.getInstance = (function () {
let instance // 外层函数定义一个唯一的变量
return 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) //true // 我们不能避免的是:js不能像Java那样将构造函数私有化,别人不知道我们代码的情况下
// 有可能直接使用new SingleObject

设计原则验证

符合单一职责原则,只能实例化唯一的一个对象

没有特别的体现开发封闭原则,但是绝对不违反开放封闭原则

场景示例

Jquery只有一个$

// Jquery只有一个$
if (window.jQuery != null) {
return window.jQuery
} else {
// 初始化
}

模拟登录框

class loginFrom {
constructor () {
this.state = 'hide'
}
show () {
if (this.state === 'show') {
console.log('已经显示')
return
}
this.state = 'show'
console.log('登录框已显示')
}
hide () {
if (this.state === 'hide') {
alert('已经隐藏')
return
}
this.state = 'hide'
console.log('登录框已隐藏')
}
} loginFrom.getInstance = (function () {
let instance
return function() {
if (!instance){
instance = new loginFrom()
}
return instance
}
})() // 测试
let login1 = loginFrom.getInstance()
login1.show() let login2 = loginFrom.getInstance()
login2.show() console.log(login1 === login2) //true

vuex和redux中的store 

vuex和redux中的store 里面存储的是应用中共享的状态数据,肯定是单例模式,比如登录状态,在整个应用中可能有很多地方会使用到登录状态,每个模块中获取到的登录状态一定时同一个

购物车

数据库连接

Bootstrap强调内容的更多相关文章

  1. 基于bootstrap的内容折叠功能

    加入js及css支持: <link rel="stylesheet" href="css/bootstrap.min.css"/> <scri ...

  2. bootstrap表格内容跑到表格外面的处理办法

    http://stackoverflow.com/questions/21587813/bootstrap-responsive-table-content-wrapping td写下这个样式即可.& ...

  3. bootstrap表格内容垂直居中

    td{ vertical-align: middle !important;}

  4. Bootstrap表格内容居中

    1.<th style='text-align: center;'>host</th> 水平居中 2.<td rowspan=$row_host1 style='vert ...

  5. Bootstrap页面布局23 - BS折叠内容

    <div class='container-fluid'> <h3 class='page-header'>Bootstrap 折叠内容</h3> <!--如 ...

  6. bootstrap中如何让响应式图片(img-responsive)水平居中

    我们在用bootstrap排版内容的时候,有的时候在内容中需要图片水平居中对齐. 一般情况下,我们的图片都使用了 .img-responsive 类来实现响应式图片.如果需要实现响应式图片水平居中,那 ...

  7. Bootstrap学习笔记之整体架构

    之前有粗略地看过一下Bootstrap的内容,不过那只是走马观花式地看下是怎么用的,以及里面有什么控件,所以就没想着记笔记.现在由于要给部门做分享,所以不得不深入地去学习下,不然仅是简单地说下怎么用, ...

  8. Bootstrap基本使用[转]

    Bootstrap是Twitter推出的一个由动态CSS语言Less写成的开源CSS/HTML框架(同时提供Sass 移植版代码).Bootstrap提供了全面的基本及组件样式并自带了13个jQuer ...

  9. bootstrap学习以及其插件

    Bootstrap中文网地址,里面有bootstrap组件的下载与使用说明,现在使用bootstrap3: http://www.bootcss.com/ W3CSchool.CC里面有学习boots ...

随机推荐

  1. SlickGrid example 3: 可编辑单元

    <button onclick="grid.setOptions({autoEdit:true})"> 设置自动辅助编辑下一个元素.   代码: <!DOCTYP ...

  2. Javascript事件委托

      事件委托利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件未使用事件委托之前: <!DOCTYPE html> <html> <head> &l ...

  3. Winform知识

    文档界面 分类: 1.单文档界面应用程序(SDI) 特点: 1.应用程序中SDI的所有窗体都彼此独立 2.多文档界面应用程序(MDI) 特点: 1.每个应用程序中只能有一个MDI父窗体,在父窗体中可以 ...

  4. Unity5 Standard自发光材质无效解决方法

    受光物和发光物都要勾选Static才会有效. 如果不够选静态就是用HDR光照,需要相机勾选HDR 所以如果是动态的物体真实发光,Unity依旧无法支持

  5. 2016年10月15日 星期六 --出埃及记 Exodus 18:26

    2016年10月15日 星期六 --出埃及记 Exodus 18:26 They served as judges for the people at all times. The difficult ...

  6. 样式其他与JS脚本语言

    样式其他:display(显示block和隐藏none,不占位置)  visibility(显示visible和隐藏hidden,占位置)  overflow(超出范围 hidden隐藏) 透明(op ...

  7. CodeForces 373B Making Sequences is Fun

    Making Sequences is Fun Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  8. Common Macros for Build Commands and Properties

    https://msdn.microsoft.com/en-us/library/c02as0cs.aspx $(ProjectDir)      The directory of the proje ...

  9. [HDOJ5763]Another Meaning(KMP, DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5763 题意:给定两个字符串a和b,其中a中的字符串如果含有子串b,那么那部分可以被替换成*.问有多少种 ...

  10. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...