JavaScript 设计模式 (一)

废话不多说啦,设计模式这个名词基本上很多人都知道。
其实就是一些厉害的人,把众人的智慧里一些重复出现的地方提炼出来,总结出来的一些思路。

学习这些模式,通过在项目中使用它们,可以使得项目代码的可扩展性和可重构性增强。虽然有时可能会把代码复杂化,但是带来的便利性却是可观的。(当然,前提是要有合理的设计和使用)

“工欲善其事,必先利其器”,要想能够更好地驾驭它们,首先就要认真了解它们。

所以,以下是我在拜读大牛出版的书籍《JavaScript设计模式与开发实践》,加上查阅资料后整理的笔记。

设计模式的类别

根据《设计模式》一书中所述,设计模式可以分成三类:

  1. 创建型
  2. 行为型
  3. 结构型

接下来,以这三种类型来展开讲述

创建型

所谓创建型,就是会将一个对象实例化。这类模式都会提供一种方法,将客户从所需要的实例化对象之中解耦

创建型的模式有:单例模式、抽象工厂模式、工厂模式、建造者模式、原型模式

单例模式

定义

单例模式确保一个类只有一个实例,并提供一个全局访问点。

场景

用于创建独一无二的,只能有一个实例的对象。

单例模式给了我们一个全局的访问点,和全局变量一样方便而又没有全局变量的缺点(命名冲突,导致变量被污染,etc···)

实现

没有公开的构造器,利用延迟实例化的方式来创建单例,这种做法对资源敏感的对象特别重要。

而在 JavaScript 中,并无类的概念,它的全局变量就是纯天然的单例对象。

但是把全局变量当作单例来使用容易造成命名污染。

p.s.
防止变量污染的方法:

  • 使用命名空间
  • 使用闭包封装私有变量

JavaScript 中的单例模式,可以使用一个闭包来实现。

var getSingleton = (function(fn){
// fn 为单例对象的构造函数
var single = null;
return function() {
// 已经生成过这个对象,就返回该对象
return single || (single = fn.apply(this, arguments));
};
})();

注意到这个栗子中,getSingleton 是一个方法,通过调用它来得到一个实例对象,也就是说,一开始没有这个实例,然后调用了才生成,这种单例对象就叫做++惰性单例++

相对的,getSingleton = {},这种就不属于惰性单例。