前言
单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式,涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个该类对象被创建,提供了一种访问其唯一的对象的
方式,可以直接访问,一般不需要实力话该类的对象
⚠️ 有以下几个点需要注意:
- 单例类只能有一个实例;
- 单例类必须自己创建自己的唯一实例;
- 单例类必须给所有其他对象提供这一实例。
✨ 模式具体介绍:
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问入口;
主要解决:一个全局使用的类频繁地创建于销毁;
何时使用:当我们需要控制实例的树木,节省系统资源的时候;
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建;
关键代码:真正实例是私有的,无法直接方法的
ES5代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var LazySingle = (function() { var _instance = null; function Single(){ return { xx: function() { }, yy: 1 }; } return function() { if(!_instance){ _instance = Single(); } return _instance; } })();
|
1 2
| console.info(LazySingle().yy);
|
优化后的ES6代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| let _instance = null; function Single(){ return { xx: function() { }, yy: 1 }; } export default class { constructor(props) { super(props); if(!_instance){ _instance = new Single(); } } }
|
1 2
| console.info(LazySingle().yy);
|
其实目前的通过commonJS以及AMD的方式来模块化每一个对象的方式,就是一个单例模式,通过将方法以及属性对外暴露,对实现机制进行对内隐藏,就是达到一种单例模式编程的思维,
只不过通过此种方式,可以更加好的来管理我们的对象。
配合static关键词的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function Single(){ return { xx: function() { }, yy: 1 }; } export default class{ static _instance = null; constructor(props) { super(props); } static getInstance(){ if(!_instance){ _instance = new Single(); } } }
|
1 2
| LazySingle.getInstance().xx();
|