一.Singleton 模式.
静态构造函数不能接受参数,而且只能有一个,他实际是私有的,由编绎器调用的.
可以用属性的方法,让他做到"接受参数"的效果.也可以建一个公有的方法,接受参数.
1,单线程Singleton模式.
/// <summary>
/// 单线程Singleton模式
/// </summary>
public class Class1
{
private static Class1 c1;
private Class1()
{}
public static Class1 C1
{
get
{
if (c1 == null)
{
c1 = new Class1();
}
return c1;
}
}
}
2,多线程Singleton模式.
/// <summary>
/// 多线程Singleton模式,方法1
/// </summary>
public class Class2
{
public static readonly Class2 C2 = new Class2();
private Class2()
{
}
}
/// <summary>
//多线程Singleton模式,方法1,相当于这样
/// </summary>
public class Class3
{
public static Class3 c3;
static Class3()
{
c3 = new Class3();
}
private Class3()
{}
}
/// <summary>
/// 多线程Singleton模式,方法2
/// </summary>
public class Class4
{
private static volatile Class4 c4 = null;
private static object lockHelper = new object();
private Class4(){}
public static Class4 C4()
{
if (c4 == null)
{
lock(lockHelper)
{
if (c4==null)
{
c4 = new Class4();
}
}
}
return c4;
}
}
3,单,多线程Singleton模式.构造函数带参数.
/// <summary>
/// 单线程Singleton模式,构造函数带参数
/// </summary>
public class Class5
{
int _x,_y;
private static Class5 c5;
private Class5(int x,int y)
{
this._x = x;
this._y = y;
}
public static Class5 getClass5(int x,int y)
{
if(c5==null)
{
c5 = new Class5(x,y);
}
else
{
c5._x = x;
c5._y = y;
}
return c5;
}
}
/// <summary>
/// 多线程Singleton模式,方法2,构造函数带参数
/// </summary>
public class Class6
{
private static volatile Class6 c6 = null;
private static object lockHelper = new object();
int _x,_y;
private Class6(int x,int y)
{
this._x = x;
this._y = y;
}
public static Class6 C6(int x,int y)
{
if (c6 == null)
{
lock(lockHelper)
{
if (c6==null)
{
c6 = new Class6(x,y);
}
}
}
else
{
c6._x = x;
c6._y = y;
}
return c6;
}
}
/// <summary>
/// 多线程Singleton模式,方法1,构造函数带参数.
/// </summary>
public class Class7
{
public static readonly Class7 c7 = new Class7();
int _x,_y;
private Class7()
{
}
public void Init(int x,int y)
{
this._x = x;
this._y = y;
}
//或者
public int x
{
get
{
return this._x;
}
set
{
this._x = value;
}
}
public int y
{
get
{
return this._y;
}
set
{
this._y = value;
}
}
}
测试代码:
private void button1_Click(object sender, System.EventArgs e)
{
Class1 c1 = Class1.C1;
Class2 c2 = Class2.C2;
Class3 c3 = Class3.c3;
Class4 c4 = Class4.C4();
Class5 c5 = Class5.getClass5(3,4);
Class6 c6 = Class6.C6(3,4);
Class7 c7 = Class7.c7;
c7.Init(3,4);
c7.x = 3;
c7.y = 4;
Class1 cc1 = Class1.C1;
Class2 cc2 = Class2.C2;
Class3 cc3 = Class3.c3;
Class4 cc4 = Class4.C4();
Class5 cc5 = Class5.getClass5(3,4);
Class6 cc6 = Class6.C6(3,4);
Class7 cc7 = Class7.c7;
cc7.Init(3,4);
cc7.x = 9;
cc7.y = 10;
if(c1==cc1 && c2==cc2 && c3==cc3 && c4==cc4
&& c5 == cc5 && c6==cc6 && c7 == cc7)
{
MessageBox.Show("Yes");
}
else
{
MessageBox.Show("No");
}
MessageBox.Show(c7.x.ToString());
MessageBox.Show(cc7.x.ToString());
}