是否有一种类似单例模式的实现,允许创建多个实例?
我的班级定义是:
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)
{
}
}
}
是否有一种类似单例模式的实现,允许创建多个实例。
如果想要多个实例,直接构造类即可,不要使其成为单例。在您的情况下,只需将构造函数公开,并删除单例/实例逻辑即可。
话虽这么说,有 Multiton 模式,它允许通过单个界面对多个实例进行键控访问。
这是我使用的模式:
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
的方法。
这是我用于多个单例的模式。
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];
}
}