在第一次访问singleton或如何初始化singleton中的对象之前,要有一些可用的值

本文关键字:singleton 对象 访问 第一次 初始化 | 更新日期: 2023-09-27 18:22:04

这是我当前的单例:

public sealed class DataCollection
{
    // creating singleton instance (http://csharpindepth.com/Articles/General/Singleton.aspx)
    private static readonly Lazy<DataCollection> lazy = new Lazy<DataCollection>(() => new DataCollection());
    public User currentUser { get; set; }
    public Filter currentFilter { get; set; }
    // fully laziness
    public static DataCollection Instance {
        get{
            return lazy.Value;
        }
    }
    private DataCollection ()
    {
    }
}

在我的Filter对象中,我有以下内容:

public class Filter
{
    public bool newEntries { get; set; }
    public List<PerfLoc> costCentres { get; set; }
    public Filter ()
    {
        newEntries = false;
        costCentres = new List<PerfLoc> ();
        read ();
    }
    public void read(){
        // do some initialization here (e.g. read some stored values in)
    }
}

现在我想这样访问Filter

globalData = DataCollection.Instance;
bool new = globalData.currentFilter.newEntries;

但是这里的Filter对象没有初始化,因此为null。我可以创建一个新的过滤器对象并设置它,然后访问它,但最好在Singleton实例中进行初始化。

所以我想到了这样一个初始化:

private DataCollection ()
{
    currentFilter = new Filter();
}

在不影响单例模式的情况下,这是正确的方法吗?在第一次访问Filter之前,应该有一个可用的值。后来我想创建一个新的Filter对象,并用我的globalData实例设置它。

在第一次访问singleton或如何初始化singleton中的对象之前,要有一些可用的值

在不影响单例模式的情况下,这是正确的方法吗?

是的,singleton只需要拥有一个实例和对该实例的访问权限,就可以随心所欲地创建它。

来自维基百科:

在软件工程中,单例模式是一种设计模式将类的实例化限制为一个对象。这是当只需要一个对象来协调跨系统。这个概念有时被推广到当只有一个对象存在或限制实例化到一定数量的对象。术语来自单例的数学概念。

有人批评使用singleton模式认为它是一种反模式,判断它被过度使用,介绍在以下情况下的不必要限制类实际上不是必需的,并将全局状态引入应用

看一看这篇文章,并判断singleton模式是否是您的正确选择。