一、单例模式
就是在整个代码全局中,只有一个实例。比如Log4.NET或者窗体程序。
二、实战演练
通过字段cSOCode获取窗体,窗体只有一个且cSOCode值不同获取的窗体也不同。
1 private static string _cSOCode; 2 private static Form1 _form1 = null; 3 4 private Form1(string cSOCode) 5 { 6 InitializeComponent(); 7 _cSOCode = cSOCode; 8 } 9 public static Form1 GetForm1(string cSOCode) 10 { 11 if (_form1 == null) 12 { 13 _form1 = new Form1(cSOCode); 14 return _form1; 15 } 16 if (_form1 != null && _cSOCode != cSOCode) 17 { 18 _form1.Dispose(); 19 _form1 = null; 20 _form1 = new Form1(cSOCode); 21 return _form1; 22 } 23 return _form1; 24 }
这样其实还不够,将窗体关闭之后重新打开会报调用的资源已经被释放的异常,这是因为窗体关闭之后资源虽然被释放了,但是_form1并不为null。
所以我们在窗体关闭的时事件中加上这段代码就ok了。
1 private void Form1_FormClosed(object sender, FormClosedEventArgs e) 2 { 3 if (_form1 != null) 4 { 5 _form1 = null; 6 } 7 }
我一直在纠结一个问题
窗体程序的这个方法是否需要执行,如果需要执行,调用我这个GetForm1()需要参数。
然后结果是不需要的,因为我是从另外一段代码调用这个窗体并不会执行这段代码。我想这段代码只有窗体作为整个应用程序的入口才会被调用。
三、扩展
单例模式在多线程中如何使用(转载https://www.cnblogs.com/zhili/p/SingletonPatterm.html)
1 /// <summary> 2 /// 单例模式的实现 3 /// </summary> 4 public class Singleton 5 { 6 // 定义一个静态变量来保存类的实例 7 private static Singleton uniqueInstance; 8 9 // 定义一个标识确保线程同步 10 private static readonly object locker = new object(); 11 12 // 定义私有构造函数,使外界不能创建该类实例 13 private Singleton() 14 { 15 } 16 17 /// <summary> 18 /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点 19 /// </summary> 20 /// <returns></returns> 21 public static Singleton GetInstance() 22 { 23 // 当第一个线程运行到这里时,此时会对locker对象 "加锁", 24 // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁 25 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁" 26 // 双重锁定只需要一句判断就可以了 27 if (uniqueInstance == null) 28 { 29 lock (locker) 30 { 31 // 如果类的实例不存在则创建,否则直接返回 32 if (uniqueInstance == null) 33 { 34 uniqueInstance = new Singleton(); 35 } 36 } 37 } 38 return uniqueInstance; 39 } 40 }
单例模式加上泛型,写成一个通用的类。(转载https://www.cnblogs.com/mointor/p/5166988.html)
1 public class GenericSingleton<T> where T : Form, new() 2 { 3 private static T t = null; 4 public static T CreateInstrance() 5 { 6 if (null == t || t.IsDisposed) 7 { 8 t = new T(); 9 } 10 return t; 11 } 12 }
欢迎大家一起沟通谈论,如果有什么问题请指出。