废话不多说啦,设计模式这个名词基本上很多人都知道。
其实就是一些厉害的人,把众人的智慧里一些重复出现的地方提炼出来,总结出来的一些思路。
学习这些模式,通过在项目中使用它们,可以使得项目代码的可扩展性和可重构性增强。虽然有时可能会把代码复杂化,但是带来的便利性却是可观的。(当然,前提是要有合理的设计和使用)
“工欲善其事,必先利其器”,要想能够更好地驾驭它们,首先就要认真了解它们。
所以,以下是我在拜读大牛出版的书籍《JavaScript设计模式与开发实践》,加上查阅资料后整理的笔记。
设计模式的类别
根据《设计模式》一书中所述,设计模式可以分成三类:
- 创建型
- 行为型
- 结构型
接下来,以这三种类型来展开讲述
创建型
所谓创建型,就是会将一个对象实例化。这类模式都会提供一种方法,将客户从所需要的实例化对象之中解耦
创建型的模式有:单例模式、抽象工厂模式、工厂模式、建造者模式、原型模式
单例模式
定义
单例模式确保一个类只有一个实例,并提供一个全局访问点。
场景
用于创建独一无二的,只能有一个实例的对象。
单例模式给了我们一个全局的访问点,和全局变量一样方便而又没有全局变量的缺点(命名冲突,导致变量被污染,etc···)
实现
没有公开的构造器,利用延迟实例化的方式来创建单例,这种做法对资源敏感的对象特别重要。
而在 JavaScript 中,并无类的概念,它的全局变量就是纯天然的单例对象。
但是把全局变量当作单例来使用容易造成命名污染。
p.s.
防止变量污染的方法:
- 使用命名空间
- 使用闭包封装私有变量
JavaScript 中的单例模式,可以使用一个闭包来实现。
注意到这个栗子中,getSingleton 是一个方法,通过调用它来得到一个实例对象,也就是说,一开始没有这个实例,然后调用了才生成,这种单例对象就叫做++惰性单例++
相对的,getSingleton = {},这种就不属于惰性单例。