多个单例c#实例

问题描述 投票:0回答:3

是否有一种类似单例模式的实现,允许创建多个实例?

我的班级定义是:

public class Logger
{
    private Logger(string logPath)
    {
        this.logPath = logPath;
    }


    /// <summary>
    /// Creates singleton 
    /// </summary>
    /// <param name="logPath"></param>
    /// <returns></returns>
    public static Logger GetInstance(string logPath)
    {
        lock (instanceLock)
        {
            if (logger == null)
            {
                logger = new Logger(logPath);
            }
        }
        return logger;
    }

    public static Logger Instance()
    {
        return logger;
    }

    /// <summary>
    /// Destructor
    /// </summary>
    ~Logger()
    {
        try
        {
            this.Close();
        }
        catch (Exception)
        {
        }
    }
}
c# singleton
3个回答
6
投票

是否有一种类似单例模式的实现,允许创建多个实例。

如果想要多个实例,直接构造类即可,不要使其成为单例。在您的情况下,只需将构造函数公开,并删除单例/实例逻辑即可。

话虽这么说,有 Multiton 模式,它允许通过单个界面对多个实例进行键控访问。


2
投票

这是我使用的模式:

public class Logger
{
    private Logger(...) { ... }

    static Logger { /* initialize Errors, Warnings */ }

    public static Logger Errors { get; private set; }
    public static Logger Warnings { get; private set; }

    public void Write(string message) { ... }
}

如果你想有

static Logger Lookup(string name)
方法,你也可以这样做。

现在在其他代码中您可以编写

Logger.Errors.Write("Some error");
Logger.Warnings.Write("Some warning");

奖励:您可以在

Environment.StackTrace
方法中使用
Write
来额外记录您调用
Write
的方法。


0
投票

这是我用于多个单例的模式。

public sealed class CCTalk
{

    public string Port { get; set; }
    private CCTalk(string port)
    {
        this.Port = port;
    }
    private static Dictionary<string, CCTalk> _instances = new Dictionary<string, CCTalk>();

    public static CCTalk GetPortInstance(string port)
    {
        if (string.IsNullOrWhiteSpace(port)) return null;

        if (!_instances.ContainsKey(port))
        {
            _instances.Add(port, new CCTalk(port));
        }
        return _instances[port];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.