2012-03-24 8 views
1

Обычно используется широко используемый объект. Каковы различные шаблоны/модели/способы совместного использования объекта через приложение?общий доступ к объекту приложения

Определяет «основной класс», а затем устанавливает переменную-член и значительно расширяет все остальные классы из этого «основного класса»? Может ли статический класс лучше и чище? Какова ваша предпочтительная модель?

ответ

4

Обычно используется широко используемый объект. Каковы различные шаблоны/модели/способы совместного использования объекта через приложение?

Одним из распространенных способов является использование одноэлементного рисунка. Однако я бы этого не избежал.

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

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

Какой у вас образец?

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

Dependency инъекции обычно работает лучше, чем при использовании одиночек, потому что:

  • Класс сам не знает зависимость, является ли или не фактически совместно; зачем ему это нужно?
  • Глобальное состояние упрощает модульное тестирование
  • Каждый класс упрощает свои зависимости при их объявлении - тогда легче ориентироваться в приложении и видеть, как классы связаны друг с другом.

Singletons и глобальные заводы более подходит, когда они для таких вещей, как лесозаготовки - но даже тогда, это означает, что это достаточно сложно проверить лесозаготовительных аспекты класса. Гораздо проще создать зависимость, которая делает то, что вам нужно, и передать это тестируемому объекту, чем добавлять способы взаимодействия с одним синглом (который обычно остается «фиксированным» после инициализации).

+0

Мне любопытно, почему следует избегать одноэлементного шаблона –

+0

@KshitijMehta: Просто добавили это - в основном для проверки. –

+0

Есть ли случай, когда вы используете шаблон singleton? Как бы вы оценили дополнительные усилия, необходимые для включения рамки DI в свой проект? –

0

Singleton pattern, AFAIK предпочтительный способ разработки программного обеспечения.

+0

Предпочтительно для чего? Злоупотребление наследованием? Да. Предпочтительно DI? Очень редко ИМО. –

1

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

0

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

Пример:

public class mySingletonClass { 

    private static mySingletonClass singleObject; 

    // Note that the constructor is private to prevent more than one 
    //instance of the class 
    private SingletonObjectDemo() { 
     // Optional Code 
    } 

    public static mySingletonClass getSingletonObject() { 
     if (singleObject == null) { 
      singleObject = new mySingletonClass(); 
     } 
     return singleObject; 
    } 
} 

Тем не менее, вы должны стараться избегать его использования; но есть некоторые приемлемые случаи, one of which is here.

Смежные вопросы