美文网首页
单例模式

单例模式

作者: hankchang | 来源:发表于2018-08-18 11:38 被阅读0次

单例模式

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

实例

  • 登录框
  • 购物车

说明

  • 单例模式需要用到 java 的特性(private)
  • ES6 中没有 (typescript 除外)
  • 只能用 Java 代码来演示 UML 图的内容
dl1.png
public class SingleObject {
  // 注意, 私有化构造函数, 外部不能 new, 只能内部 new !!!
  private SingleObject(){
  }
  // 唯一被 new 出来的对象
  private SingleObject instance = null
  // 获取对象的唯一接口
  public SingleObject getInstance() [
    if (instance == null) {
      // 只能 new 一次
      instance = new SingleObject()
    }
  ]

  // 对象方法
  public void login(username, password) [
    System.out.printIn('login...')
  ]
}

// 测试
public class SingletonPatternDemo {
  public static void main(String[] args) {
    // 不合法的构造函数
    // 编译时报错: 构造函数 SingleObject() 是不可见的 !!!
    // SingleObject object = new SingleObject()

    // 获取唯一可用的对象
    SingleObject object = SingleObject.getInstance()
    object.login()
  }
}

JS 中使用单例模式

class SingleObject {
  login() {
    console.log("login...");
  }
}
SingleObject.getInstance = (function() {
  let instance;
  return function() {
    if (!instance) {
      instance = new SingleObject();
    }
    return instance;
  };
})();

// 测试: 注意这里只能使用静态函数 getInstance, 不能 new SingleObject() !!!
const obj1 = SingleObject.getInstance();
obj1.login();
const obj2 = SingleObject.getInstance();
obj2.login();
console.log(obj1 === obj2); // true

const obj3 = new SingleObject(); // 无法完全控制
obj3.login();
console.log(obj1 === obj3); // false

但是我们做不到 不能 new SingleObject(), 只能靠文档约束


场景

  • jQuery
jQuery.png
  • 登录框
class LoginForm {
  constructor() {
    this.state = "hide";
  }
  show() {
    if (this.state === "show") {
      console.log("已经显示");
      return;
    }
    this.state = "show";
    console.log("登录框显示成功");
  }
  hide() {
    if (this.state === "hide") {
      console.log("已经隐藏");
      return;
    }
    this.state = "hide";
    console.log("登录框隐藏成功");
  }
}

LoginForm.getInstance = (function() {
  let instance;
  return function() {
    if (!instance) instance = new LoginForm();
    return instance;
  };
})();

// 测试

const login1 = LoginForm.getInstance();
login1.show();

const login2 = LoginForm.getInstance();
login2.hide();

console.log(login1 === login2); // true
  • 其他
    • 购物车 (和登录框类似)
    • vuex 和 redux 中的 store

设计原则验证

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

相关文章

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • Telegram开源项目之单例模式

    NotificationCenter的单例模式 NotificationCenter的单例模式分析 这种单例模式是...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • 单例模式

    单例模式1 单例模式2

  • java的单例模式

    饿汉单例模式 懒汉单例模式

网友评论

      本文标题:单例模式

      本文链接:https://www.haomeiwen.com/subject/uyzxiftx.html