本文共 2645 字,大约阅读时间需要 8 分钟。
系统中被唯一使用
一个类只有一个实例
传统 UML 类图
说明
private
)TypeScript
除外)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(); }}
js 使用单例模式
class SingleObject { // 定义一个类 login() { // 登陆方法(不是静态的)每初始化 Object 时,都会有 login 方法 console.log('login...') } ...}// 静态方法,getInstance 是挂载到 class 上的,无论 SingleObject 被 new 多少个,这个 getInstance 还是只有一个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) // 两者必须完全相等let obj3 = new SingleObject() // 无法完全控制obj3.login()console.log(obj1 === obj3)
jQuery 的全局函数是 $,只有一个
如果检测到内部有 jQuery,就会直接返回,如果没有就会进行初始化操作
多次初始化的问题
消耗性能
多次渲染、多次统计
等等)// jQuery 只有一个 `$`if (window.jquery != null) { return window.jQuery} else { // 初始化...}
class LoginForm { constructor() { this.state = 'hide' } show() { if (this.state === 'show') { alert('已经显示') return } this.state = 'show' console.log('登录框已显示') } hide() { if (this.state === 'hide') { alert('已经隐藏') return } this.state = 'hide' console.log('登录框已隐藏') }}
LoginForm.getInstance = (function() { let instance return function() { if(!instance) { instance = new LoginForm(); } return instance }})()
// 测试let login1 = LoginForm.getInstance()login1.show()let login2 = LoginForm.getInstance()login2.hide()console.log(login1 === login2)
购物车(和登录框类似)
完全一样
的,这样才能导致业务的数据同步
共享
的数据共享
和数据传递
,所以是单例模式单一职责
原则,只实例化唯一的对象
绝对不违反开放封闭原则
转载地址:http://lcqwi.baihongyu.com/