单例模式: 又被称为单体模式, 是只允许实例化一次的对象类.
运用:
1. 用一个对象来规划一个命名空间 (如: JQuery 库, 单例模式就为它提供了一个命名空间), 井井有条地管理对象上的属性与方法.
2. 通过单例模式来管理代码库的各个模块
模块化的概念由来已久, 并且在 JS 中也有很长久的使用历史. 通常我们在编写代码时, 会将复杂的问题根据实际情况进行合理的拆分, 让代码更具备可读性与可维护性. 因此一个模块可以理解为整体的一部分. 而且随着 JS 应用复杂度的提高, 模块化的应用也变成了必须.
在之前的 JS 中, 没有专门为模块化提供相应的语法支持, 但好在我们还有闭包. 因此以前我们借助自执行函数来模拟一个模块.
- var moduleDemo = (function name(params) {
- function bar() {};
- function foo() {};
- function map() {};
- return {
- bar: bar,
- foo: foo,
- map: map,
- }
- })();
- // 访问模块内部的方法
- moduleDemo.bar();
bar,foo,map 三个方法在函数内部被定义, 但是却可以在外部使用. 所以很简单就能看出, 我们借助闭包实现了模块. 借助这样的思路, 我们可以封装一些工具方法组成一个单独的工具模块, 以避免代码的重复编写. 这样的比较出名的实践有 lodash, axios 等. 他们都是在实践中用得比较多的工具模块.
模块化是单例模式的一种实践应用.
3. 管理静态变量
静态变量特点: 只能访问不能修改, 创建后就能使用
---js 实现方法, 定义在函数内部, 只能通过特权方法访问, 不提供赋值变量的方法, 只提供获取变量的方法
而为了实现创建后就能访问, 就让创建的函数执行一次, 此时, 我们创建的对象内保存静态变量通过取值器访问, 最后将这个对象作为一个单例放在全局空间里作为静态变量单例对象供他人使用
(先创建好, 不管需不需在内存中都会存在这个单例对象 ------ 俗称 "恶汉模式")
代码 demo: 主要使用了一个自执行的一个闭包, 自执行保证创建之后就能使用, 而闭包能保护数据, 数据的访问, 通过闭包返回一个取值器的方法 (借助闭包实现单例模式)
- var config = (function(){
- var conf = {
- MAX_NUM : 100,
- MIN_NUM : 0,
- COUNT: 100,
- }
- return {
- // 取值器方法
- get: function (name) {
- return conf[name] ? conf[name] : null;
- }
- }
- })()
4. 惰性单例
而有些单例对象需要延迟创建, 有人也称之为 "惰性创建"(如果已经创建了就直接返回, 如果没有被创建, 就创建一个出来, 即需要的时候进行创建 --------- 俗称 "懒汉模式")
- // 惰性载入单例
- var LazySingle = (function (){
- // 单例实例引用
- var _instance = null;
- // 单例
- function Single(){
- /* 这里定义私有属性和方法 */
- return {
- publicMethod: function (){},
- publicProperty: '1.0',
- }
- }
- // 获取单例对象接口
- return function() {
- // 如果不是这个单例九江创建单例模式
- if (!_instance) {
- _instance = Single();
- }
- return _instance;
- }
- })()
- console.log(LazySingle().publicProperty)
以上, 可以总结出单例模式的好处:
1. 定义命名空间, 便于管理与维护
2. 比起每次 new 一个对象出来, 可以大大减少内存, 减少对资源的占用
来源: http://www.bubuko.com/infodetail-2696117.html