2016-05-05 3 views
1

Есть ли какие-либо шаблоны дизайна для создания, которые позволяют создавать совершенно новые объекты (как в новой записи) без необходимости добавлять оператор new где-нибудь в существующем коде?Существуют ли шаблоны дизайна для создания, которые создают новые классы?

+0

Вы имеете в виду, что вам не придется менять свою программу, чтобы вообще ссылаться на новый класс (а не только на то, что вам не нужно говорить «новый»)? Или ваш вопрос действительно о том, как создать экземпляр класса, на котором вы ссылаетесь, но ничего не знаете? –

ответ

1

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

Регистрация: Каждый класс, который хочет быть обнаруженным зарегистрирован где-то, где структура может найти его:

  • имя класса помещается в свойстве переменной среды или системы Java, в файле, и т.д. .
  • некоторый код добавляет класс или его имя для одноплодного списка в начале выполнения программы

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

  • В начале программы, возможно, должен быть явно указан какой-то код в начале программы (например, the old way of choosing a JDBC driver).
  • В Ruby код, определяющий класс, может зарегистрировать класс где-нибудь (или сделать что-либо еще), когда класс определен. Достаточно require файл, содержащий класс.

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

Существует несколько способов найти классы, которые спускаются с данного типа в Java (here's one SO question, here's another) и Ruby. Как и в случае самостоятельной регистрации, на языках, подобных тем, где классы динамически загружаются, необходимо сделать что-то, чтобы убедиться, что класс загружен, прежде чем запрашивать время выполнения, какие классы доступны.

+0

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

1

Одна вещь, которая, я думаю, здесь заключается в том, что кто-то должен сделать new вашему новому классу. Если вы этого не делаете, может потребоваться некоторая инфраструктура.

Я помню что-то подобное, что я сделал в одном из своих побочных проектов с использованием Java Spring. У меня был интерфейс и несколько реализаций. Мой проект, необходимый для итерации по всем реализациям, выполняет некоторую обработку. Теперь для этого даже я искал какое-то решение, с которым мне не пришлось бы вручную создавать экземпляр этого конкретного класса или некоторую явную проводку этого конкретного класса. Поэтому Spring облегчил мне сделать это через аннотацию @Autowired. Он вводил всю реализацию этого интерфейса «на лету». Например: -

@Autowired 
private List<IMyClass> myClassImplementations; 

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

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