Параметризованные одиночные узоры - PullRequest
5 голосов
/ 30 сентября 2008

Ссылка здесь перечисляет ([http://www.yoda.arachsys.com/csharp/singleton.html][1]) некоторые одноэлементные паттерны в C #. В статье также описывается очевидное, что синглтон не предназначен для приема параметров, которые «в противном случае второй запрос для экземпляра, но с другим параметром может быть проблематичным ». Это означает, что любые параметры, необходимые для работы класса, должны быть вызваны как свойство.

Мне любопытно узнать, есть ли какие-либо параметризованные шаблоны проектирования синглтонов. Принятие значений в качестве свойства ничего не навязывает потребителю.

Ответы [ 2 ]

3 голосов
/ 30 сентября 2008

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

Затем вы использовали бы этот класс фабрики для запроса объекта на основе параметров, которые вы передали, и, если он существует в своем внутреннем списке, он возвращается, а если нет, создается новый экземпляр, а затем добавляется в список. и вернулся.

1 голос
/ 30 сентября 2008

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

В идеале синглтон-класс не должен зависеть от внешнего кода.

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

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

В основном у вас будет фабрика классов. Он вернет один и тот же объект для тех же параметров.

В этом случае у вас будет N одноэлементных объектов - то есть объекты с другим состоянием будут рассматриваться как совершенно разные экземпляры.

Примеры таких синглетонов можно найти в контейнерах Inversion of Controls.

Например, у вас может быть какая-то услуга, которая зависит от других услуг. При вызове container.Get (вид услуги). Контейнер DI автоматически инициализирует экземпляр службы с необходимыми параметрами и возвращает его вызывающей стороне. Но этот экземпляр службы становится одноэлементным - вы не сможете создать другой сервис с такими же параметрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...