一、单例模式

  就是在整个代码全局中,只有一个实例。比如Log4.NET或者窗体程序。

二、实战演练

  通过字段cSOCode获取窗体,窗体只有一个且cSOCode值不同获取的窗体也不同。

  

 private static string _cSOCode;
private static Form1 _form1 = null; private Form1(string cSOCode)
{
InitializeComponent();
_cSOCode = cSOCode;
}
public static Form1 GetForm1(string cSOCode)
{
if (_form1 == null)
{
_form1 = new Form1(cSOCode);
return _form1;
}
if (_form1 != null && _cSOCode != cSOCode)
{
_form1.Dispose();
_form1 = null;
_form1 = new Form1(cSOCode);
return _form1;
}
return _form1;
}

这样其实还不够,将窗体关闭之后重新打开会报调用的资源已经被释放的异常,这是因为窗体关闭之后资源虽然被释放了,但是_form1并不为null。

所以我们在窗体关闭的时事件中加上这段代码就ok了。

 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (_form1 != null)
{
_form1 = null;
}
}

我一直在纠结一个问题

窗体程序的这个方法是否需要执行,如果需要执行,调用我这个GetForm1()需要参数。

然后结果是不需要的,因为我是从另外一段代码调用这个窗体并不会执行这段代码。我想这段代码只有窗体作为整个应用程序的入口才会被调用。

三、扩展

  单例模式在多线程中如何使用(转载https://www.cnblogs.com/zhili/p/SingletonPatterm.html)

  

 /// <summary>
/// 单例模式的实现
/// </summary>
public class Singleton
{
// 定义一个静态变量来保存类的实例
private static Singleton uniqueInstance; // 定义一个标识确保线程同步
private static readonly object locker = new object(); // 定义私有构造函数,使外界不能创建该类实例
private Singleton()
{
} /// <summary>
/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
// 当第一个线程运行到这里时,此时会对locker对象 "加锁",
// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
// 双重锁定只需要一句判断就可以了
if (uniqueInstance == null)
{
lock (locker)
{
// 如果类的实例不存在则创建,否则直接返回
if (uniqueInstance == null)
{
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}

  单例模式加上泛型,写成一个通用的类。(转载https://www.cnblogs.com/mointor/p/5166988.html)

 public class GenericSingleton<T> where T : Form, new()
{
private static T t = null;
public static T CreateInstrance()
{
if (null == t || t.IsDisposed)
{
t = new T();
}
return t;
}
}

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

最新文章

  1. IOS定位
  2. 【Android学习】Windows下Android环境搭建
  3. Java面向对象三大特点之封装
  4. .NET程序的编译和运行
  5. RHEL 6.0使用CentOS yum源
  6. 序列GCD和问题(题目)
  7. win32 摄像头捕获系统vfw
  8. [poco] HttpRequest之post方法
  9. JavaScript高级程序设计-10.11: DOM及其扩展
  10. redis 安装启动及设置密码&lt;windows&gt;
  11. Vue中使用Cropper.js裁剪图片
  12. JavaScript的运行机制
  13. spring多个AOP执行先后顺序(面试问题:怎么控制多个aop的执行循序)
  14. intellij idea 搜索功能快捷键
  15. (转)Db2 数据库性能优化中,十个共性问题及难点的处理经验
  16. setUserVisibleHint-- fragment真正的onResume和onPause方法
  17. AOJ1024 Cleaning Robot 2.0
  18. Spring AOP笔记
  19. Android开发(7)数据库和Content Provider
  20. 20155301 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

热门文章

  1. C++编译器优化技术:RVO、NRVO和复制省略
  2. Redis开发与运维:特性
  3. fjnu2019第二次友谊赛 B题
  4. 体感在js中的调用
  5. ASP.NET MVC5基础-控制器(Controller)详解
  6. centos添加用户并赋予管理员权限
  7. thymeleaf Exception processing template &quot;xxx&quot;: Exception parsing document: template=&quot;xxx&quot;, line 6 - column 3报错解决的几种方法
  8. java的异常抛出throws和throw的简单使用
  9. 剑指offer 28:字符串的排列
  10. android笔记--Intent和IntentFilter详解