JavaScript 中的单例设计模式

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 容易受到比赛条件的影响,所以如果没有实例首先被初始化,那么两个线程可以创建两个对象,而不是返回和实例。

Published At
Categories with 技术
Tagged with
comments powered by Disqus