zoukankan      html  css  js  c++  java
  • 设计模式-单例模式(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     }

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

  • 相关阅读:
    noip2012 同余方程
    bzoj1477 poj1061 青蛙的约会
    Nginx 从入门到放弃(五)
    Nginx 从入门到放弃(四)
    Nginx 从入门到放弃(三)
    Nginx 从入门到放弃(二)
    Nginx 从入门到放弃(一)
    python三大神器之fabric
    Docker 学习(一)
    linux就该这么学 第一天学习笔记
  • 原文地址:https://www.cnblogs.com/birdGe/p/11078181.html
Copyright © 2011-2022 走看看