定义:一个类仅有一个实例,并提供一个访问它的全局访问点

实现思路:通过一个变量判断是否已经创建过对象了,如果是,直接返回此变量。

基础实现

  1. /**
  2. * 单例模式基础实现
  3. * 缺点:没有透明化
  4. * @param {String} name
  5. */
  6. var Singleton = function (name) {
  7. this.name = name
  8. }
  9. Singleton.prototype.getName = function () {
  10. console.log(this.name)
  11. }
  12. Singleton.getInstance = function (name) {
  13. var instance = null
  14. return function (name) {
  15. if (!instance) {
  16. instance = new Singleton(name)
  17. }
  18. return instance
  19. }
  20. }
  21. var a = Singleton.getInstance('test1')

使用代理类实现单例模式

  1. var CreateDiv = function (html) {
  2. this.html = html
  3. this.init()
  4. }
  5. CreateDiv.prototype.init = function () {
  6. var div = document.createElement('div')
  7. div.innerHTML = this.html
  8. document.body.appendChild(div)
  9. }
  10. // 使用代理实现单例模式
  11. var ProxySingletonCreateDiv = (function () {
  12. var instance
  13. return function (html) {
  14. if (!instance) {
  15. instance = new CreateDiv(html)
  16. }
  17. return instance
  18. }
  19. })()
  20. var a = new ProxySingletonCreateDiv('test1')

惰性单例

在需要的时候才会创建实例,并且只创建一个实例

通常会把创建对象和管理实例职责分开,以达到组件复用的作用

  1. /**
  2. *
  3. * 创建对象和管理单例的职责要分开
  4. */
  5. var getSingle = function (fn) {
  6. var result
  7. return function () {
  8. return result || (result = fn.apply(this, arguments))
  9. }
  10. }
  11. var createLoginLayer = function () {
  12. var div = document.createElement('div')
  13. div.innerHTML = '我是浮窗'
  14. div.style.display = 'none'
  15. document.body.appendChild(div)
  16. return div
  17. }
  18. var createSingleLoginLayer = getSingle(createLoginLayer)