C#-c#有多少种实现单例模式的方法?

发布于 2017-01-11 14:01:19 字数 11 浏览 1277 评论 4

请列出来

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

偏爱自由 2017-06-12 12:10:50

具体来说,一般是两种:懒汉式和饿汉式。
懒汉式模式如下,不会主动创建单例,在类第一次使用的时候创建单例:

public class single
{
private static single instance = null;

private single() {}

synchronize public static single getInstance()
{
if(instance == null)
{
instance = new single();
}
return instance;
}
}

饿汉式模式如下,加载类的同时创建单例:

public class single
{
private static single instance = new instanc();

private single() {}

public static single getInstance()
{
return instance;
}
}

归属感 2017-03-06 00:20:20

只要掌握了思想就好了啊。具体的实现可以根据需求的不同来调整啊。。

难道说.Net framework给提供了什么比较方便的接口?

浮生未歇 2017-03-04 10:46:53

加一个双检索方式,对于多线程访问时控制:

 public class Singleton
{
private static Singleton _instance;

private Singleton()
{
}
static object obj = new object();
public static Singleton GetInstance()
{

if (_instance == null)
{
lock (obj)
{

if (_instance == null)
{
_instance = new Singleton();
}
}
}

return _instance;
}

}

偏爱自由 2017-02-04 03:03:12

有很多种写法,主要是要保证单线程构造实例

方法一:声明时构造

public class Singleton
{
// 在创建类型时创建,CLR保证类型创建时是单线程
private static readonly Singleton _instance = new Singleton();
private Singleton() {} // 构造器私有

public static Singleton GetInstance() { return _instance; }
}

方法二:类型构造器时构造

public class Singleton
{
private static Singleton _instance;

static Singleton() {
_instance = new Singleton(); // 与上一种写法一致
}

private Singleton() {} // 构造器私有

public static Singleton GetInstance() { return _instance; }
}

方法三:在需要时构造

public class Singleton
{
private static readonly object _objLock = new object();
private static Singleton _instance;

private Singleton() {} // 构造器私有

public static Singleton GetInstance() {

lock(_objLock) {
if(_instance == null) {
_instance = new Singleton();
}
}

return _instance;
}
}

方法四:在需要时构造,对方法进行单线程控制

public class Singleton
{
private static Singleton _instance;

private Singleton() {} // 构造器私有

[MethodImpl(MethodImplOptions.Synchronized)]
public static Singleton GetInstance() {
// 确保只有单线程来控制示例,但是需要保证别的地方不会被调用
if(_instance == null) {
_instance = new Singleton();
}

return _instance;
}
}

相对而言,方法一与方法二是最安全的方式,当然了,也可以用锁或者别的线程控制方式来保证单一线程的安全性。

其次就是方法3了,好处就是只在调用GetInstance来创建实例,减少构建开销。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文