为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过将不同的参数传递给构造函数来允许实例化不同的单例类

如何通过将不同的参数传递给构造函数来允许实例化不同的单例类

C#
catspeake 2021-07-14 13:10:02
我的项目中有一个类,我只想通过构造函数传递特定参数来实例化它一次,但是当我传递不同的参数时,它应该实例化一个新的参数。我如何使用单例设计模式实现这一目标?或者,如果单例无法实现,您能否建议另一种设计模式?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.}}
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

您必须修改_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; }

}


查看完整回答
反对 回复 2021-07-18
?
慕的地10843

TA贡献1785条经验 获得超8个赞

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text.RegularExpressions;


namespace Rextester

{

    public class Program

    {

        public static void Main(string[] args)

        {

            var g = SiteStructure.Instance(4);

        }

    }




    public sealed class SiteStructure { 

 public static SiteStructure Instance() 

 { return new SiteStructure();

 }

        public static SiteStructure Instance (int x)

        { return new SiteStructure (x);

        }


 SiteStructure() { }

SiteStructure(int x) { Console.WriteLine("Hello"); }



}


}


查看完整回答
反对 回复 2021-07-18
  • 2 回答
  • 0 关注
  • 252 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信