Skip to content

Commit 7bf46f7

Browse files
committed
2020.01.12
1 parent c997b2d commit 7bf46f7

1 file changed

Lines changed: 39 additions & 3 deletions

File tree

Cute-JavaScript/Cute-Patterns/1.单体模式(Singleton).md

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
## 一、单体模式(Singleton Pattern)
22
### 1.概念介绍
3-
**单体模式(Singleton Pattern)**的思想在于**保证一个特定类仅有一个实例**,即不管使用这个类创建多少个新对象,都会得到**与第一次创建的对象完全相同**
3+
**单体模式(Singleton Pattern)**的思想在于**保证一个特定类仅有一个实例**,并提供一个访问它的全局访问点。
4+
5+
即不管使用这个类创建多少个新对象,都会得到**与第一次创建的对象完全相同**
46

57
它让我们能将代码组织成一个逻辑单元,并可以通过单一变量进行访问。
68

7-
单体模式有以下优点:
9+
单体模式有以下**优点:**
10+
811
* 用来划分命名空间,减少全局变量数量。
912
* 使代码组织的更一致,提高代码阅读性和维护性。
10-
* 只能被实例化一次。
13+
* 内存中只有一个实例,减少了内存开支。
14+
* 可以在系统设置全局的访问点,优化和共享资源的访问。
15+
16+
**缺点:**
17+
18+
一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
1119

1220
但在JavaScript中没有类,只有对象。当我们创建一个新对象,它都是个新的单体,因为JavaScript中永远不会有完全相等的对象,除非它们是同一个对象。
1321
因此,**我们每次使用对象字面量创建对象的时候,实际上就是在创建一个单例**
@@ -31,7 +39,9 @@ let a1 = {
3139
}
3240
new a1(); // Uncaught TypeError: a1 is not a constructor
3341
```
42+
3443
下面展示一个单体模式的基本结构:
44+
3545
```js
3646
let Singleton = function (name){
3747
this.name = name;
@@ -52,6 +62,32 @@ g2.getName(); // 'leo'
5262
```
5363
从这里可以看出,单体模式只能实例化一次,后面再调用的话,都是使用第一次实例化的结果。
5464

65+
使用 TypeScript 实现一个简单的单体模式:
66+
67+
```js
68+
class Singleton {
69+
private constructor() { }
70+
71+
private static singleton: Singleton
72+
public static getInstance(): Singleton {
73+
if (!Singleton.singleton) {
74+
Singleton.singleton = new Singleton();
75+
}
76+
return Singleton.singleton
77+
}
78+
}
79+
function show(): void {
80+
const s1 = Singleton.getInstance();
81+
const s2 = Singleton.getInstance();
82+
if (s1 == s2) {
83+
console.log(111)
84+
} else {
85+
console.log(222)
86+
}
87+
}
88+
show()
89+
```
90+
5591
### 2.应用场景
5692
单例模式只允许实例化一次,能提高对象访问速度并且节约内存,通常被用于下面场景:
5793
* 需要频繁创建再销毁的对象,或频繁使用的对象:如:弹窗,文件;

0 commit comments

Comments
 (0)