李建忠,设计模式教程.笔记061221

一.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());

  }
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值