單例模式:
保證一個類僅有一個執行個體,並提供一個訪問它的全域訪問點。
類自身負責儲存它的唯一執行個體。
注意:多線程
使用鎖,或C#靜態類——Demo3
Demo1:——WinForm
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.IsMdiContainer = true;
}
private void button1_Click(object sender, EventArgs e)
{
Form2.Show1().Show();
}
}
public partial class Form2 : Form
{
private static Form2 f;
private Form2()
{
InitializeComponent();
}
publicstatic Form2 Show1()
{
if (f == null || f.IsDisposed)
{
f = new Form2();
f.MdiParent = Form1.ActiveForm;
}
return f;
}
private void Form2_Load(object sender, EventArgs e)
{
}
}
Demo2:
classProgram
{
static voidMain(string[] args)
{
child c1= child.GetChild();
child c2 = child.GetChild();
c1.A = 5;
Console.WriteLine(c2.A);
Console.ReadKey();
}
}
class child
{
private static child c;
private child() { }
public staticchild GetChild()
{
if (c == null)
{
c = new child();
}
return c;
}
private int a;
public int A
{
get { return a; }
set { a = value; }
}
}
Demo3:
1:
privatestatic child c;
private static readonly object syncRoot = newobject();//鎖
private child() { }
public static child GetChild()
{
lock (syncRoot)
{
if (c == null)
{
c = new child();
}
}
return c;
}
2:雙重鎖
privatestatic child c;
private static readonly object syncRoot = new object();//鎖
private child() { }
public static child GetChild()
{
if (c == null)
{
lock (syncRoot)
{
if (c == null)
{
c = new child();
}
}
}
return c;
}
3:靜態類
sealed class child//sealed聲明靜態類,阻止派生增加執行個體
{
privatestatic readonly child c=new child();//第一次引用類的任何成員時建立執行個體。公用語言運行庫負責處理變數初始化
private child() { }
public static child GetChild()
{
returnc;
}
private int a;
public int A
{
get { return a; }
set { a = value; }
}
}