我意识到我应该只有一个名为StdSchedulerFactory
的对象实例一次运行。到目前为止,我实例化了像这样的对象
StdSchedulerFactory sf = new StdSchedulerFactory(properties);
属性是NameValueCollection
。
如何为此对象编写Singleton类,以便变量 sf 在整个程序中始终具有一个实例?
答案 0 :(得分:9)
Singleton
模式的一部分通常是私有构造函数,因此其他类不能创建新实例。
来自课外的参数的解决方法是添加“Init”或“Configure”功能:
public static void Configure(NameValueCollection properties)
{
}
当然,如果您忘记调用此功能,您可能会得到您不想要的行为;所以你可能想要设置一个“已配置”标志或类似的东西,以便你的其他功能可以在没有调用此函数时做出适当的反应。
答案 1 :(得分:1)
这是一个基本的Singleton实现。 不线程安全。
public sealed class StdSchedulerFactory
{
private static readonly StdSchedulerFactory instance;
private NameValueCollection _properties;
private StdSchedulerFactory(NameValueCollection properties)
{
_properties = properties;
}
public static StdSchedulerFactory GetInstance(NameValueCollection properties)
{
if (instance == null)
{
instance = new StdSchedulerFactory(properties);
}
else
{
return instance;
}
}
}
答案 2 :(得分:1)
这是我实现简单单例模式的两种最喜欢的方式。第二个在调试时更容易:)
public sealed class SingletonOne
{
private static readonly Lazy<SingletonOne> instance = new Lazy<SingletonOne>(() => new SingletonOne());
private Lazy<Controller> controller = new Lazy<Controller>(() => new Controller(properties));
private static object properties = null;
public static SingletonOne Instance { get { return instance.Value; } }
public Controller GetController(object properties)
{
SingletonOne.properties = properties;
return this.controller.Value;
}
}
public sealed class SingletonTwo
{
private static readonly SingletonTwo instance = new SingletonTwo();
private Controller controller;
private static object properties = null;
public static SingletonTwo Instance
{
get
{
return SingletonTwo.instance;
}
}
public Controller GetController(object properties)
{
SingletonTwo.properties = properties;
if(this.controller == null)
{
this.controller = new Controller(SingletonTwo.properties);
}
return this.controller;
}
}
public class Controller
{
public Controller(object properties) { }
}