首页 > 解决方案 > 如何通过将不同的参数传递给构造函数来允许实例化不同的单例类

问题描述

我的项目中有一个类,我只想通过构造函数传递一个特定参数来实例化它一次,但是当我传递不同的参数时,它应该实例化一个新参数。我如何使用单例设计模式来实现这一点?或者,如果单例无法实现,您能否建议另一种设计模式?

class Program
{
static void Main()
{
    SiteStructure s = SiteStructure.Instance;
}
}

public sealed class SiteStructure
{
static readonly SiteStructure _instance = new SiteStructure();
public static SiteStructure Instance
{
    get
    {
        return _instance;
    }
}
SiteStructure()
{
    // Initialize.
}
}

标签: c#design-patternssingleton

解决方案


您必须修改_instance变量的初始化方式,使用一个接受您要传入的参数值的函数。此外,_instance变量不能再是readonly因为它需要在新函数内部进行初始化。

[TestMethod]
public void CreateSingletonInstance()
{
    SiteStructure s = SiteStructure.GetInstance("Abc123");
    Debug.Print(s.Parameter); // outputs Abc123

    SiteStructure s2 = SiteStructure.GetInstance("Is it really a singleton?");
    Debug.Print(s2.Parameter); // outputs Is it really a singleton?

    SiteStructure s3 = SiteStructure.GetInstance("Abc123");
    Debug.Print(s3.Parameter); // outputs Abc123

    Assert.AreNotEqual(s, s2); // Check to make sure they are different instances
    Assert.AreEqual(s, s3); // Check to make sure they are the same instance
}

public sealed class SiteStructure
{
    static Dictionary<string, SiteStructure> _siteStructures = new Dictionary<string, SiteStructure>();
    static object _instance_Lock = new object();
    public static SiteStructure GetInstance(string parameter)
    {
        if (!_siteStructures.ContainsKey(parameter))
        {
            lock (_instance_Lock)
            {
                if (!_siteStructures.ContainsKey(parameter))
                {
                    _siteStructures.Add(parameter, new SiteStructure(parameter));
                }
            }
        }

        return _siteStructures[parameter];
    }

    private SiteStructure(string parameter)
    {
        // Initialize.
        Parameter = parameter;
    }

    public string Parameter { get; set; }
}

推荐阅读