Какой шаблон проектирования я должен использовать, если мне требуется, чтобы группа классов-одиночек была доступна для поиска / поиска? - PullRequest
1 голос
/ 11 апреля 2011

Мне нужно иметь только один экземпляр группы классов в моем проекте.Тем не менее, мне нужно, чтобы они были доступны для поиска / извлечения (как массив).Какой шаблон дизайна я должен использовать?

Ответы [ 4 ]

1 голос
/ 11 апреля 2011

Инкапсулируйте коллекцию в синглтон.Это фактически делает все содержащиеся экземпляры Singletons.

C # пример:

public class Singleton
{
    public static Singleton Current { get; }

    public IEnumerable<IFoo> Foos { get; }
}

Вы можете перечислять и запрашивать Foos, открывая Singleton.Current.Foos.Поскольку Singleton инкапсулирует экземпляры IFoo, он может убедиться, что существует только один экземпляр каждого из них, но вы также можете превратить каждую из реализаций IFoo в Singletons.Однако в этом нет необходимости.

1 голос
/ 11 апреля 2011

Я не уверен, правильно ли я понимаю, но думаю, что, возможно, вам нужен контейнер Dependency Injection.Взгляните на Inversion Of Control / Dependency Injection шаблонов.

Microsoft Patterns & Practices предлагает реализацию контейнера DI под названием Unity .Существуют и другие проекты с открытым исходным кодом, такие как Castle Windsor и другие

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

IUnityContainer container = new UnityContainer();
container.RegisterType<MyClass>(new ContainerControlledLifetimeManager()); 
...
var mySingletonType = container.Resolve<MyClass>(); // All calls to this method will 
  // return the same instance

IoC /На самом деле DI - это нечто большее, но я надеюсь, что этот пример будет вам полезен в качестве отправной точки.

0 голосов
/ 20 июня 2012

Java-версия решения Марка:

  public class Singleton {
      public static Singleton instance = new Singleton();
      public Set<Singleton> singletons = new HashSet<Singleton>;

      //Instance can only be created inside this class
      private Singleton(){

      }  

      static {
        // Add all the singleton's to set
        singletons.add(MyArray.class);
        ... 
      }

      public static Singleton getInstance() {
             return instance;
      }

      public static Set getSingletons() {
             return singletons;
      } 


  }
0 голосов
/ 12 апреля 2011

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

Но то, что вы описываете, похоже на Multiton Pattern , так что это можетстоит посмотреть.

...