2

我需要帮助解决这个问题。我试过搜索,我想我可能已经找到了使用单例设计模式的解决方案,但想确定一下。

我有一个用 Visual C# 编写的 Windows 窗体应用程序。我正在编写一个 SerialPort 类,以便可以通过所有形式共享它(我不需要多个串行端口实例)。这是为了将逻辑与 GUI 分开。所有形式都可以对 SerialPort 类进行各种更改,例如波特率、写入、读取等。

实施此解决方案的最佳方法是什么?我是 OOP 的新手,所以任何关于阅读的建议都会很棒。

4

3 回答 3

3

正如你已经说过的,这个问题可以使用单例设计模式来解决。这是一个小样本:

public class MySingleton() {
    private static MySingleton instance = new MySingleton();

    //your attributes go here...
    private MySingleton() {
    //your logic goes here...
    }

    public static MySingleton getInstance() {
        return instance;
    }
}

请注意,如果您的静态实例将用于多个线程,您的类应该锁定共享资源。我会让你参考线程安全代码

于 2012-04-25T23:14:44.503 回答
1

替代@Luiggi 的解决方案,这里有一点线程良心:

public sealed class SerialPort
{
  private static volatile SerialPort instance;
  private static object threadLock = new Object();

  /// <summary>Retrieve an instance of SerialPort</summary>
  public static SerialPort Instance
  {
    get
    {
      if (SerialPort.instance == null)
      {
        lock (SerialPort.threadLock)
        {
          if (SerialPort.instance == null)
          {
            SerialPort.instance == new Serialport();
          }
        }
      }
      return SerialPort.instance;
    }
  }

  private SerialPort(){}
}

然后,在实践中:

SerialPort sp = SerialPort.Instance;
sp.MyMethod(...);

有关此单例模式的更多信息。

于 2012-04-25T23:27:29.377 回答
1

实际上,我昨天刚刚遇到了同样的问题,我想我可能已经找到了一种更简单的方法来解决这个问题,而不是使用单例方法。我制作了一个类文件并创建了一个名为public class Serial. 在里面我将我的串行变量声明为static SerialPort(即static SerialPort serial);如果您需要使用计时器,则与计时器相同。为 set 和 get 创建一个函数serialStatus,在其中设置 a public static bool。我真的很想在这里发布我的代码,但我真的不明白如何正确地做到这一点。在您的表单中,您将让第一个表单启动串行端口。对于另一种形式,您所要做的就是声明Serial serial = new Serial();提取方法,您就可以开始了。如果您需要更改串行设置,您可以创建一个带有 bool 输入的方法(即 if true,serial.Close();然后使用新设置重新启动串行。

于 2012-06-13T17:49:53.910 回答