Вложенный класс Singleton - PullRequest
0 голосов
/ 23 декабря 2009

Возможно ли вложить одноэлементный класс в не-одноэлементный класс в C #, и если да, есть ли какие-либо ограничения в жизненном цикле синглтона в этом случае?

public class NonSingletonClass
{
  public NonSingletonClass()
  {
    // Initialize some stuff.
  }

  // Put some methods here.

  public class SingletonClass
  {
    // Singleton construction goes here.

    // Put some methods here.
  }
}

В дизайне моего приложения это имеет смысл, но мне нужно знать о любых потенциальных ошибках, прежде чем я на самом деле реализую это.

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

Ответы [ 4 ]

4 голосов
/ 23 декабря 2009

Да, синглтон может жить совершенно комфортно в не-синглтоне.

Жизненный цикл вложенного класса полностью независим от жизненного цикла внешнего класса. Существует очень небольшая разница между вложенным классом и не вложенным классом в C #. (Существуют некоторые различия - вложенный класс имеет доступ к закрытым членам внешнего класса, а методы расширения должны находиться, например, во вложенном статическом классе - но это не влияет на жизненный цикл .

Была ли у вас особая проблема?

2 голосов
/ 23 декабря 2009

Я полагаю, вы ищете моностатический шаблон

эта ссылка является хорошим описанием этого и предлагает контрасты с одноэлементным шаблоном моностатура

0 голосов
/ 24 декабря 2009

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

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

Если параллелизм не является проблемой для приложения, я считаю, что использование частных вложенных классов является отличным способом скрыть детали реализации и обеспечить, чтобы у каждого объекта была только одна роль.

0 голосов
/ 23 декабря 2009

Полагаю, мой первый вопрос: не могли бы вы дать нам больше подробностей, учитывая, что вы заявили, что «дизайн моего приложения имеет смысл». Абстрактная фабрика и конструктор - это всего лишь некоторые шаблоны, использующие одноэлементные классы. Вы храните какие-то глобальные данные, которые будут использоваться в NonSingletonClass.

...