C # Singleton повторное использование кода - PullRequest
4 голосов
/ 03 марта 2011

У меня есть несколько классов, которые делают разные вещи, но используют один и тот же шаблон Singleton из http://www.yoda.arachsys.com/csharp/singleton.html

public sealed class Singleton
{
static Singleton instance=null;
static readonly object padlock = new object();

Singleton()
{
}

public static Singleton Instance
{
    get
    {
        lock (padlock)
        {
            if (instance==null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}
}

У кого-нибудь есть изящный способ, которым я могу повторно использовать как можно больше общего кода Singletonнасколько возможно между различными классами?

Например, если у меня есть SingletonJob1 и SingletonJob2, я бы хотел иметь возможность изменять код только в том случае, если я перехожу к одному из других шаблонов Singleton.

Редактировать: Да, как уже отмечали люди, метод 5 из http://www.yoda.arachsys.com/csharp/singleton.html - это меньше кода.Я прочитал до конца страницы!Я выбрал метод 2, потому что объекты Singleton относятся к аппаратным устройствам, и я хочу, чтобы только несколько из них были инициализированы и использованы при любом запуске программы.Метод 5 сразу их инициализирует.

Ответы [ 5 ]

5 голосов
/ 03 марта 2011

Есть ли причина, по которой вы используете эту версию, а не более простую, которая просто инициализирует экземпляр в объявлении?

public class Singleton
{
    private static Singleton instance = new Singleton();
    public static Singleton Instance { get { return instance; } }

    // Only use this if you really need it - see the page for details
    static Singleton() {}

    private Singleton()
    {
        // I assume this logic varies
    }
}

Этот шаблон достаточно короткий, и я не думаю, что онпроблема, чтобы включить это повсюду.

Я хотел бы призвать вас подумать, действительно ли вам нужно столько синглетонов;как правило, они не очень хороши для тестируемости и т. д.

РЕДАКТИРОВАТЬ: Если вы действительно, действительно хотите лени и вы используете .NET 4, вы можете получить его с 6-ым шаблоном, который находится на singletonновый дом страницы :

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
}
3 голосов
/ 03 марта 2011
public static class Singleton<T>  where T: new()
{

static T instance=null;
static readonly object padlock = new object();

public static T Instance
{
    get
    {
        lock (padlock)
        {
            if (instance==null)
            {
                instance = new T();
            }
            return instance;
        }
    }
}

}

Так что вы можете использовать свой синглтон для всех классов:

Singleton<YourClass>.Instance.YourMethod();
2 голосов
/ 03 марта 2011

Как то так?

public sealed class Singleton<T>
{
static T instance=null;
static readonly object padlock = new object();
static Func<T> createInstance;

Singleton(Func<T> constructor)
{
   createInstance = constructor;
}

public static T Instance
{
    get
    {
        lock (padlock)
        {
            if (instance==null)
            {
                instance = createInstance();
            }
            return instance;
        }
    }
}
}
2 голосов
/ 03 марта 2011
1 голос
/ 03 марта 2011

Я верю, что это то, что вы после. Однако я настоятельно рекомендую избегать этого шаблона Singleton (заглавная S), так как он сокрушает все души юнит-тестирования и затрудняет управление кучей вещей.

public class Singleton<T> where T : new()
{
  private static T _Instance;
  private static readonly object _InstanceLock = new object();

  public static T Instance
  {
    get
    {
      if (_Instance == null)
      {
        lock (_InstanceLock)
        {
          if (_Instance == null)
          {
            _Instance = new T();
          }
        }
      }
      return _Instance;
    }
  }

}

public class Foo : Singleton<Foo>
{
  public void Something()
  {
  }
}

public class Example
{
  public static void Main()
  {
    Foo.Instance.Something();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...