C#类、窗体和程序实现单例模式

  • 发布时间:2016年3月8日 10:03
  • 作者:杨仕航
  • 分类标签: C#
  • 阅读(8268)
  • 评论(0)

有些时候需要程序只能运行一个实例(包括窗体和类)。像大部分杀毒软件,我们打开一次之后,再打开发现会自动弹出我们之前打开的界面。因为像这类软件占用资源比较多,所以运行一个实例就行了,比较节省资源而且方便控制。

这个也就是为什么有时候需要只运行一个实例。


先来说说类这么实现单例模式。这个很简单,你可以把这个类改成静态类就行,或者使用静态变量这种东西。

class ClsTest
{
    private static ClsTest _instance;
    
    //把默认构造函数改成私有的,避免不小心用到
    private ClsTest(){}
    
    //通过该静态方法获取实例
    public static ClsTest GetInstance()
    {
        if(_instance == null)
        {
            _instance = new ClsTest();
        }
        return _instance;
    }
}


接下来,再说一下窗体。虽然窗体也是类,但是窗体关闭就释放掉资源,不能一直用下去。如下代码:

public partial class FrmTest : Form
{
    private static FrmTest _instance;

    private FrmTest()
    {
        InitializeComponent();
        FrmTest._instance = this;
    }

    public static FrmTest GetInstance()
    {
        if(FrmTest._instance == null)
        {
            FrmTest._instance = new FrmTest();
        }
        return FrmTest._instance;

    }

    //窗体关闭的时候,释放掉这个对象
    private void FrmTest_FormClosed(object sender, FormClosedEventArgs e)
    {
        FrmTest._instance = null;
    }
}


最后,再说一下整个程序的单例模式。这个就要复杂一些了。在Program.cs入口处加如下代码:

Process[] processes = System.Diagnostics.Process.GetProcessesByName(Application.CompanyName);
if (processes.Length > 1)
{
    MessageBox.Show("应用程序已经在运行中。。");
    Thread.Sleep(1000);
    System.Environment.Exit(1);
}
else
{
    Application.Run(new FrmMain());
}

该方法是通过进程名判断是否有同名进程存在。当然还有其他方法可以实现单例模式,大家可以尝试一下。

上一篇:我的网站搭建(第13天) 用户认证:前言

下一篇:Python求解一元二次方程

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空