博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
李建忠,设计模式教程.笔记061221
阅读量:4028 次
发布时间:2019-05-24

本文共 2774 字,大约阅读时间需要 9 分钟。

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

  }

 

转载地址:http://iuobi.baihongyu.com/

你可能感兴趣的文章
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>
性能调优之iostat命令详解
查看>>
性能调优之iftop命令详解
查看>>
非关系型数据库(nosql)介绍
查看>>
移动端自动化测试-Windows-Android-Appium环境搭建
查看>>
Xpath使用方法
查看>>
移动端自动化测试-Mac-IOS-Appium环境搭建
查看>>
Selenium之前世今生
查看>>
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>
测试必会之 Linux 三剑客之 sed
查看>>
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>