JavaScript 中的单例设计模式


该系列的一部分:
JavaScript 设计模式

每个开发人员都努力编写可维护、可读和可重用的代码。随着应用程序变得更大,代码结构变得更加重要。设计模式证明对于解决这一挑战至关重要 – 在特定情况下为常见问题提供组织结构。

下面的设计模式只是可以帮助您升级为 JavaScript 开发人员的许多有用模式之一。有关完整集,请参阅JavaScript 设计模式

Singleton 只允许单个实例化,但同一对象的多个实例。Singleton 限制客户端创建多个对象,在创建第一个对象后,它将返回自身的实例。

对于大多数之前尚未使用过单例的人来说,找到它的用例是很困难的。一个例子是使用办公室打印机。如果一个办公室有十个人,他们都使用一台打印机,那么十台计算机共享一台打印机(实例)。通过共享一台打印机,他们共享相同的资源。

var printer = (function () {

    var printerInstance;

    function create () {

    function print() {
        // underlying printer mechanics
    }

    function turnOn() {
        // warm up
        // check for paper
    }

    return {
        // public + private states and behaviors
        print: print,
        turnOn: turnOn
    };
    }

    return {
    getInstance: function() {
        if(!printerInstance) {
        printerInstance = create();
        }
        return printerInstance;
    }
    };

    function Singleton () {
    if(!printerInstance) {
        printerInstance = intialize();
    }
    };

})();

create 方法是私有的,因为我们不希望客户端访问它,但是,请注意getInstance方法是公共的。每个官员可以通过与getInstance方法交互来生成打印机实例,如下所示:

var officePrinter = printer.getInstance();

在 AngularJS 中,单例很普遍,最著名的是服务、工厂和提供者。由于它们维护状态并提供资源访问,创建两个实例违背了共享服务/工厂/提供者的意义。

当多个线程尝试访问同一资源时,多线程应用程序中会出现竞争条件。单例容易受到竞争条件的影响,因此如果没有先初始化实例,则两个线程可以创建两个对象,而不是返回和实例。这违背了单身人士的目的。因此,开发人员在多线程应用程序中实现单例时必须了解同步。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁