您的位置:首页 > 其它

单例模式(Singleton)

2016-06-26 17:19 162 查看

单例模式(Singleton)

        保证一个类仅有一个实例,提供一个访问它的全局访问点。



1.饿汉式单例类

        静态初始化的方式:自己被加载时就将自己实例化。所有要提前占用系统资源
        C#与公共语言运行库提供。
Singleton类:
public  sealed class Singleton //阻止派生
{
private static readonly Singleton instance=new Singleton ();
//第一次引用类时创建实例。
private Singleton (){}
public static Singleton GetInstance()
{
return instance ;
}
}

客户端
Singleton s1 = Singleton.GetInstance();//得到实例s1
Singleton s2 = Singleton.GetInstance();

if(s1==s2)
{
Console.WriteLine("两个对象是相同的实例");
}
Console.Read();

2.懒汉式单例类

第一次被引用时,才将自己实例化。面临着多线程访问的安全性问题。需要双重锁定才可以保证安全
Singleton类:

class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();
//程序运行时创建一个静态只读的进程辅助对象
private Singleton()
{
//构造方法
}
public static Singleton GetInstance() //此方法是获得本类实例的唯一全局访问点
{
if (instance == null)
{
lock (syncRoot)//锁,只有一个线程可以进入
{
if (instance == null)//若实例不存在,则new一个新实例。否则返回已有的实例
{
instance = new Singleton();
}
}

}

return instance;
}
}
客户端代码相同。省略……
————————————————————————————————————————————————————————————

懒汉——单例模式:子窗体加载 

public partial  class FormToolbox : Form
{
private static FormToolbox ftb = null;
private static readonly object syncRoot = new object();
private FormToolbox()
{
InitializeComponent();
}
//得到类实例的方法。返回值就是本类对象,注意也是静态
public static FormToolbox GetInstance()
{
if (ftb == null || ftb.IsDisposed)
{
lock (syncRoot)
{
if (ftb == null || ftb.IsDisposed)
{
ftb = new FormToolbox();
ftb.MdiParent = Form1.ActiveForm;
ftb.Show();
}
}
}
return ftb;
}

}
form1窗体(父窗体)
private void Form1_Load(object sender, EventArgs e)
{
this.IsMdiContainer = true;//属性
}
private void ToolStripMenuItemToolbox_Click(object sender, EventArgs e)
{
FormToolbox .GetInstance ().Show ();
}

private void toolStripButton1_Click(object sender, EventArgs e)
{
FormToolbox.GetInstance().Show();
}
效果图

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