Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# singleton c的多个实例#_C#_Singleton - Fatal编程技术网

C# singleton c的多个实例#

C# singleton c的多个实例#,c#,singleton,C#,Singleton,是否实现了一种类似于单例的模式,允许创建多个实例 我的班级定义是: public class Logger { private Logger(string logPath) { this.logPath = logPath; } /// <summary> /// Creates singleton /// </summary> /// <param name="logPath">&

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

我的班级定义是:

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)
        {
        }
    }
}
公共类记录器
{
专用记录器(字符串日志路径)
{
this.logPath=logPath;
}
/// 
///创造单身
/// 
/// 
/// 
公共静态记录器GetInstance(字符串日志路径)
{
锁(instanceLock)
{
如果(记录器==null)
{
记录器=新记录器(logPath);
}
}
返回记录器;
}
公共静态记录器实例()
{
返回记录器;
}
/// 
///析构函数
/// 
~Logger()
{
尝试
{
这个。关闭();
}
捕获(例外)
{
}
}
}
是否实现了一种类似于单例的模式,它允许创建多个实例

如果需要多个实例,只需允许直接构造类,而不要将其设置为单实例。在您的情况下,只需将构造函数公开,并删除单例/实例逻辑

也就是说,有一个接口,它允许通过单个接口对多个实例进行键控访问

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

如果需要多个实例,只需允许直接构造类,而不要将其设置为单实例。在您的情况下,只需将构造函数公开,并删除单例/实例逻辑


也就是说,有一个,它允许通过一个接口对多个实例进行键控访问。

这是我使用的模式:

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) { ... }
}
如果您想要一个
静态记录器查找(字符串名称)
方法,您也可以这样做

现在,在其他代码中,您可以编写
Logger.Errors.write(“一些错误”)
记录器。警告。写入(“一些警告”)


奖励:您可以在
写入方法中使用
环境。StackTrace
来额外记录您调用的
写入方法。

这是我使用的模式:

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) { ... }
}
如果您想要一个
静态记录器查找(字符串名称)
方法,您也可以这样做

现在,在其他代码中,您可以编写
Logger.Errors.write(“一些错误”)
记录器。警告。写入(“一些警告”)


奖励:您可以在
Write
方法中使用
环境。StackTrace
来额外记录您调用的
Write
方法。

LoggerFactory
?顺便说一句,implement
IDisposable
Interface不确定这里的重点是什么,看起来你只是为一个类的实例提供了一个包装器?请解释一下你所说的“一个类似于单例的模式,它允许多个实例。”我想这就是所谓的“一个不遵循单例模式的常规类”允许您创建多个实例的单例只是一个类。使用单例,然后创建多个实例是没有意义的。听起来更像是一个返回实例的工厂。如果您正在寻找一个特定的实例,我想工厂可以跟踪它们,并且您可以使用一个字符串键来标识它,但我不知道我是否建议工厂跟踪它提供的实例。
LoggerFactory
?顺便说一句,implement
IDisposable
Interface不确定这里的重点是什么,看起来你只是为一个类的实例提供了一个包装器?请解释一下你所说的“一个类似于单例的模式,它允许多个实例。”我想这就是所谓的“一个不遵循单例模式的常规类”允许您创建多个实例的单例只是一个类。使用单例,然后创建多个实例是没有意义的。听起来更像是一个返回实例的工厂。如果您正在寻找一个特定的实例,我想工厂可以跟踪它们,您可以用一个字符串键来标识它,但我不知道我是否建议工厂跟踪它提供的实例。@IlyaIvanov很难知道-原始问题中没有足够的细节来知道需要什么。我提到Multiton是因为~在日志类型的类中,允许访问不同的“logger”目标是有意义的。是的,我只是认为他使用
string
作为intances的键,所以很难知道应该事先填充多少实例。他还使用了一些资源,如果这些资源是由
池管理的,而不是由user@IlyaIvanov难以知道-原始问题中没有足够的细节来知道需要什么。我提到Multiton是因为~在日志类型的类中,允许访问不同的“logger”目标是有意义的。是的,我只是认为他使用
string
作为intances的键,所以很难知道应该事先填充多少实例。他还使用了一些资源,如果这些资源是由
池管理的,而不是由用户管理的,那就太好了