我将这种模式用于单身人士,在单例中,单身人士是PlanetEarth:
var NAMESPACE = function () {
var privateFunction1 = function () {
privateFunction2();
};
var privateFunction2 = function () {
alert('I\'m private!');
};
var Constructors = {};
Constructors.PlanetEarth = function () {
privateFunction1();
privateFunction2();
};
Constructors.PlanetEarth.prototype = {
someMethod: function () {
if (console && console.log) {
console.log('some method');
}
}
};
Constructors.Person = function (name, address) {
this.name = name;
this.address = address;
};
Constructors.Person.prototype = {
walk: function () {
alert('STOMP!');
}
};
return { …Run Code Online (Sandbox Code Playgroud) 可能重复:
在Python中定义单例是否有简单,优雅的方法?
在Python中实现单例模式的最佳方法是什么?似乎不可能像通常使用Singleton模式那样声明构造函数是私有的还是受保护的......
面对现实吧.Singleton模式是高度争议与成群程序员话题都围栏边.有些人认为,辛格尔顿只不过是一个美化的全球变量,而其他人则以模式发誓并不断使用它.但是,我不希望单身人士的争议成为我问题的核心. 每个人都可以进行一场拔河比赛并与之抗争,看看谁能为我所关心的所有人赢得胜利.我想说的是,我不相信有一个正确的答案,我不是故意尝试激烈的党派争吵.当我问这个问题时,我只对单身替代品感兴趣:
他们是GOF Singleton模式的任何特定替代品吗?
例如,很多次我在过去使用单例模式时,我只想保留一个或多个变量的状态/值.但是,变量的状态/值可以使用静态变量而不是使用单例模式在类的每个实例化之间保留.
还有什么其他的想法?
编辑: 我真的不希望这是另一篇关于"如何正确使用单身人士"的帖子.再一次,我正在寻找避免它的方法.为了好玩,好吗?我想我在你最好的电影预告片中问一个纯粹的学术问题,"在一个没有单身的平行宇宙中,我们能做什么?"
我从来没有找到关于帮助器/实用程序类的这些简单问题的良好答案:
为什么我要创建一个单例(无状态)而不是使用静态方法?
如果对象没有状态,为什么需要对象实例?
AngularJS在其文档中明确指出服务是单身人士:
AngularJS services are singletons
Run Code Online (Sandbox Code Playgroud)
与直觉相反,module.factory也返回一个Singleton实例.
鉴于非单例服务有很多用例,实现工厂方法返回服务实例的最佳方法是什么,这样每次ExampleService声明一个依赖项时,它都会被一个不同的实例所满足ExampleService?
我们都知道我们在Spring容器中默认使用bean作为单例,如果我们有一个基于Spring框架的Web应用程序那么在这种情况下我们真的需要实现Singleton设计模式来保存全局数据而不是仅仅通过spring创建一个bean .
如果我无法解释我其实想要问的问题,请耐心等待.
在Apple的使用Swift with Cocoa和Objective-C文档(针对Swift 3更新)中,他们给出了以下Singleton模式的示例:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
Run Code Online (Sandbox Code Playgroud)
让我们假设这个单例需要管理一个可变的字符串数组.如何/在哪里声明该属性并确保它被正确初始化为空[String]数组?
基于SO问题编写的最佳单例实现在Java中 - 即使用枚举创建单例 - 有什么区别/优点/缺点(构造函数省略)
public enum Elvis {
INSTANCE;
private int age;
public int getAge() {
return age;
}
}
Run Code Online (Sandbox Code Playgroud)
然后打电话 Elvis.INSTANCE.getAge()
和
public enum Elvis {
INSTANCE;
private int age;
public static int getAge() {
return INSTANCE.age;
}
}
Run Code Online (Sandbox Code Playgroud)
然后打电话 Elvis.getAge()
多个文本说,当在.NET中实现双重检查锁定时,您锁定的字段应该应用volatile修饰符.但为什么呢?考虑以下示例:
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不"锁定(syncRoot)"完成必要的内存一致性?在"lock"语句之后,读取和写入都是不稳定的,因此必须实现必要的一致性,这不是真的吗?