Как разрешить создание другого одноэлементного класса путем передачи различных параметров в конструктор - PullRequest
0 голосов
/ 02 июня 2018

У меня есть класс в моем проекте, и я хочу создать его экземпляр только один раз, передав определенный параметр через конструктор, но когда я передаю другой параметр, он должен создать новый.Как я могу добиться этого с помощью шаблона Singleton?Или вы можете предложить другой шаблон проектирования, если он не может быть достигнут с помощью синглтона?

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 ]

0 голосов
/ 02 июня 2018
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"); }


}

}
0 голосов
/ 02 июня 2018

Вы должны изменить способ инициализации переменной _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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...