c# - 如何通过将不同的参数传递给构造函数来允许实例化不同的单例类
问题描述
我的项目中有一个类,我只想通过构造函数传递一个特定参数来实例化它一次,但是当我传递不同的参数时,它应该实例化一个新参数。我如何使用单例设计模式来实现这一点?或者,如果单例无法实现,您能否建议另一种设计模式?
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.
}
}
解决方案
您必须修改_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; }
}
推荐阅读
- ios - Swift 检索用户表自定义列
- git - 为什么从特定的 GitHub 存储库合并到本地 Git 存储库会导致本地存储库中未提交的更改?
- mysql - mysql更新json属性和一个查询中的另一列
- java - Jmeter:在 CSV 行中执行计算并在测试中使用计算值
- c++ - Maya 和 Cuda 11 类型重新声明错误
- python - 在这种情况下,切换到警报的命令不起作用
- reactjs - React.cloneElement 克隆已经克隆的元素以添加新的道具
- drake - 将 OMPL 与 Drake 一起使用
- javascript - JS 将数据从“宽”转为“长”
- r - 如何从R中另一个数据框的变量自动制作一个新的数据框?