代码之家  ›  专栏  ›  技术社区  ›  Fraz Zaki

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

  •  1
  • Fraz Zaki  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   JayV    7 年前

    你必须改变 _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; }
    }
    
        2
  •  0
  •   Wilmar Arias    7 年前
    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"); }
    
    
    }
    
    }