设计模式-单例模式(winfrom带参)

一、单例模式

  就是在整个代码全局中,只有一个实例。比如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     }

欢迎大家一起沟通谈论,如果有什么问题请指出。

 

posted on 2019-06-25 11:04  爱写代码的鸟  阅读(719)  评论(0编辑  收藏  举报