您的位置:首页 > 其它

单例模式

2015-11-16 11:39 288 查看

概述

  单例模式可以简单理解为一个类只有一个实例化,并提供全局的访问点。

单例模式存在的意义

  举个例子,在操作系统中,任务管理器只能存在一个,对吧。那么接下来的事情就是简单的实现单例模式了。

实现简单的单例模式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Singleton
{
public class Singleton
{
//使用静态变量保存类的实例
private static Singleton uniqueInstance;

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

/// <summary>
/// 全局访问点
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
if (uniqueInstance==null)
{
Console.WriteLine("实例化 单例模式.");
uniqueInstance = new Singleton();
}
else
{
Console.WriteLine("返回 单例模式");
}
return uniqueInstance;
}

}

class Program
{
static void Main(string[] args)
{
Singleton.GetInstance();
Singleton.GetInstance();
}
}
}

  1.  私有构造函数:

    只有在该类中使用,不能被外界访问。也就是说,该类不能通过外界 new操作 实例化一个对象。而只能在本类中实例化。

  2. 静态变量:

    静态变量是在堆分配的,而普通变量是在栈上分配的,也就是说它的生存期为整个源程序。

  3. 静态函数:

    静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。 这里,我们使用静态函数访问静态变量。

多线程下的单例模式

  在上诉代码中,如果是多线程的情况,很有可能会创建多个实例化。但是我们想要的是,只要第一次创建该实例,其他情况都返回该实例。我们的解决方案是采用线程加锁的方式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Singleton
{
public class Singleton
{
//使用静态变量保存类的实例
private static Singleton uniqueInstance;

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

//线程锁
private static readonly object locker = new object();

/// <summary>
/// 全局访问点
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
if (uniqueInstance==null)
{
lock (locker)
{
if (uniqueInstance == null)
{
Console.WriteLine("实例化 单例模式.");
uniqueInstance = new Singleton();
}
}
}
else
{
Console.WriteLine("返回 单例模式");
}
return uniqueInstance;
}

}

class Program
{
static void Main(string[] args)
{
Singleton.GetInstance();
Singleton.GetInstance();
}
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: