具有参数的对象的单例类

时间:2014-10-22 17:11:40

标签: c# design-patterns singleton

我意识到我应该只有一个名为StdSchedulerFactory的对象实例一次运行。到目前为止,我实例化了像这样的对象

StdSchedulerFactory sf = new StdSchedulerFactory(properties);

属性NameValueCollection。 如何为此对象编写Singleton类,以便变量 sf 在整个程序中始终具有一个实例?

3 个答案:

答案 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) { }
}