Singleton 只允许单个实例,但允许同一个对象的许多实例. Singleton 限制客户端创建多个对象,在第一个对象创建后,它会返回自身的实例。
对于大多数尚未使用过 Singletons 的用户来说,找到 Singletons 的使用案例是困难的。 一个例子是使用办公打印机. 如果办公室里有十个人,他们都使用一个打印机,那么十台计算机共享一个打印机(实例)。
1var printer = (function () {
2
3 var printerInstance;
4
5 function create () {
6
7 function print() {
8 // underlying printer mechanics
9 }
10
11 function turnOn() {
12 // warm up
13 // check for paper
14 }
15
16 return {
17 // public + private states and behaviors
18 print: print,
19 turnOn: turnOn
20 };
21 }
22
23 return {
24 getInstance: function() {
25 if(!printerInstance) {
26 printerInstance = create();
27 }
28 return printerInstance;
29 }
30 };
31
32 function Singleton () {
33 if(!printerInstance) {
34 printerInstance = intialize();
35 }
36 };
37
38})();
创建方法是私有的,因为我们不希望客户端访问它,但是请注意 getInstance 方法是公共的. 每个官员可以通过与 getInstance 方法进行交互来生成打印机实例,如下:
1var officePrinter = printer.getInstance();
在 AngularJS 中, Singletons 很普遍,最突出的是服务、工厂和供应商. 由于它们维护状态并提供资源访问,创建两个实例打败了共享服务/工厂/提供商的点。
比赛条件发生在多线程应用程序中,当多个线程试图访问相同的资源时。 Singletons 容易受到比赛条件的影响,所以如果没有实例首先被初始化,那么两个线程可以创建两个对象,而不是返回和实例。