具有参数的构造函数的单例

时间:2018-01-09 08:34:10

标签: c# winforms

我有一个winform构造函数,其参数为:

    public SnippingTool(Bitmap screenShot)
        {
            InitializeComponent();
            this.BackgroundImage = screenShot;
            ...
        }

当app正在运行时,我只需要winform的一个实例,所以我决定使用单例模式。

我发现了这种结构(由于我的类构造函数中的参数,它不合适):<​​/ p>

    private static SnippingTool instance;

    public static SnippingTool GetInstance
    {
        get
        {
            if (instance == null)
            {
                instance = new SnippingTool();
            }
            return instance;
        }
    }

如何通过单例传递参数?

5 个答案:

答案 0 :(得分:1)

如果Bitmap每次都不同,并且你肯定只想要一个SnippingTool,那么Bitmap甚至可能都没有该工具的实例变量,那么Bitmap在构造函数中肯定没有位置。

而是使Bitmap成为您在SnippingTool实例上调用的主要“操作”方法的参数。

或者,如果您需要SnippingTool将位图作为“状态”(因为它是一个表单,并且需要显示和编辑图像),那么创建SetImage(Bitmap b)等方法,ClearImage()等。

答案 1 :(得分:0)

private static SnippingTool instance;

public static SnippingTool GetInstance(Bitmap screenShot)
{
        if (instance == null || instance.IsDisposed)
        {
           instance = new SnippingTool(); 
        }
        instance.SetBitmap(screenShot); // if you need otherwise pass it to constructor
        return instance;
}

答案 2 :(得分:0)

您也可以创建方法而不是属性。

private static SnippingTool _instance;

public static SnippingTool GetInstance(Bitmap screen)
{
    get
    {
        if (_instance == null || _instance.IsDisposed)
        {
            _instance = new SnippingTool(screen);
        }

        return _instance;
    }
}

答案 3 :(得分:0)

试试这个

 private static SnippingTool instance;

 private SnippingTool (var par){
   ....
 }

 public SnippingTool createSingleton(var par){
   if instance != null 
               return instance;
   else 
      return new SnippingTool(par);
 }

答案 4 :(得分:0)

如果此SnippingTool只能与一个BitMap实例一起使用,则没有理由始终将one传递给singleton属性/方法。这至少会让人感到困惑,因为调用者会认为他会得到这个位图的工具。如果传递不同的实例,该方法应抛出异常。但这是否有意义,在我看来并不多。

所以我会这样做,实施SetScreenshotSetInstance方法,例如:

public class SnippingTool
{
    private SnippingTool(Bitmap screenShot)
    {
        this.ScreenShot = screenShot;
    }

    private static SnippingTool instance;

    public static void SetScreenshot(Bitmap screenShot)
    {
        if (instance == null || instance.IsDisposed)
        {
            instance = new SnippingTool(screenShot);
        }
        else
        {
            // now your logic, is it allowed then overwrite the screenShot, otherwise:
            throw new ArgumentException("It's not allowed to change the screenShot for this SnippingTool", nameof(screenShot));
        }
    }

    public static SnippingTool GetInstance
    {
        get
        {
            if (instance == null)
                throw new Exception("The SnippingTool needs a screenShot first, use first " + nameof(SetScreenshot));
            return instance;
        }
    }

    public Bitmap ScreenShot { get; }

    // ...
}