该系列的一部分:
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 中,单例很普遍,最著名的是服务、工厂和提供者。由于它们维护状态并提供资源访问,创建两个实例违背了共享服务/工厂/提供者的意义。
当多个线程尝试访问同一资源时,多线程应用程序中会出现竞争条件。单例容易受到竞争条件的影响,因此如果没有先初始化实例,则两个线程可以创建两个对象,而不是返回和实例。这违背了单身人士的目的。因此,开发人员在多线程应用程序中实现单例时必须了解同步。