回顾这篇文章列举了使用单例的几个问题 并看过使用单例模式的Android应用程序的几个例子,我想知道使用Singletons而不是通过全局应用程序状态共享的单个实例是一个好主意(继承android.os.Application并获取它通过context.getApplication()).
两种机制都有哪些优点/缺点?
说实话,我希望在这篇文章中使用Web应用程序的单例模式得到相同的答案,不是一个好主意!但适用于Android.我对么?DalvikVM有什么不同呢?
编辑:我想对涉及的几个方面有意见:
如果您可以定位iOS 4.0或更高版本
使用GCD,它是在Objective C(线程安全)中创建单例的最佳方法吗?
+ (instancetype)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
Run Code Online (Sandbox Code Playgroud) 我的单例访问器方法通常是以下的一些变体:
static MyClass *gInstance = NULL;
+ (MyClass *)instance
{
@synchronized(self)
{
if (gInstance == NULL)
gInstance = [[self alloc] init];
}
return(gInstance);
}
Run Code Online (Sandbox Code Playgroud)
我可以做些什么来改善这个?
在ARC下的单例的共享实例访问器中使用dispatch_once的确切原因是什么?
+ (MyClass *)sharedInstance
{
// Static local predicate must be initialized to 0
static MyClass *sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
sharedInstance = [[MyClass alloc] init];
// Do any other initialisation stuff here
});
return sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)
在后台异步实例化单例不是一个坏主意吗?我的意思是如果我请求共享实例并立即依赖它会发生什么,但dispatch_once要到圣诞节才能创建我的对象?它不会马上回来吗?至少这似乎是Grand Central Dispatch的重点.
那他们为什么要这样做呢?
在JavaScript中实现单例模式的最简单/最简洁的方法是什么?
编辑:从另一个问题我提供了一个答案,链接到很多关于单身人士的问题/答案:有关单身人士的更多信息:
所以我读过Singletons的帖子:好的设计还是拐杖?
争论仍然激烈.
我认为单身人士是一种设计模式(好的和坏的).
Singleton的问题不是模式而是用户(对不起所有人).每个人和他们的父亲都认为他们可以正确地实施一个(而且从我做过的许多采访中,大多数人都做不到).此外,因为每个人都认为他们可以实现正确的Singleton,他们滥用模式并在不合适的情况下使用它(用Singletons替换全局变量!).
所以需要回答的主要问题是:
我对这篇文章的希望是,我们可以在一个地方收集(而不是谷歌和搜索多个网站)一个权威的来源,了解何时(以及如何)正确使用单身人士.同样合适的还有一份反用法和常见的不良实施清单,解释了为什么他们无法工作以及为了实现他们的弱点.
所以让球滚动:
我会举起手来说这是我用的,但可能有问题.
我喜欢"Scott Myers"在他的书"Effective C++"中处理这个主题
使用单身人士的好情况(不是很多):
- 记录框架
- 线程回收池
/*
* C++ Singleton
* Limitation: Single Threaded Design
* See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
* For problems associated with locking in multi threaded applications
*
* Limitation:
* If you use this Singleton (A) within a destructor of another Singleton (B)
* This Singleton (A) must be fully constructed before the constructor of (B)
* is called.
*/
class MySingleton
{ …Run Code Online (Sandbox Code Playgroud) 换句话说,这个Singleton实现线程是否安全:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
Run Code Online (Sandbox Code Playgroud) public sealed class Singleton
{
Singleton() {}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested() {}
internal static readonly Singleton instance = new Singleton();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望在我目前的C#应用程序中实现Jon Skeet的Singleton模式.
我对代码有两个疑问
如何访问嵌套类中的外部类?我的意思是
internal static readonly Singleton instance = new Singleton();
Run Code Online (Sandbox Code Playgroud)
有什么叫封闭吗?
我无法理解这个评论
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit …Run Code Online (Sandbox Code Playgroud)有没有办法在模块内部设置全局变量?当我尝试以最明显的方式执行此操作时,如下所示,Python解释器说该变量__DBNAME__不存在.
...
__DBNAME__ = None
def initDB(name):
if not __DBNAME__:
__DBNAME__ = name
else:
raise RuntimeError("Database name has already been set.")
...
Run Code Online (Sandbox Code Playgroud)
并在将模块导入另一个文件后
...
import mymodule
mymodule.initDB('mydb.sqlite')
...
Run Code Online (Sandbox Code Playgroud)
追溯是: __DBNAME__
有任何想法吗?我正在尝试使用模块来设置单例,根据这个人的建议.