2015-05-19 2 views
2

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

+0

Вы можете создать фабрику singleton, в которой вы создадите команды. Трудность заключается в настройке параметров. Вы могли бы просто использовать карту и простой интерфейс или создать фабрику, чтобы предоставить вам определенный объект параметра для вашей команды. –

+4

Предоставьте более подробную информацию об атрибутах команд, все ли они необходимы, имеют ли команды много конструкторов, имеют ли команды CommMands одни и те же параметры? –

ответ

2

Насколько мне известно, традиционно не используется шаблон для создания команд. Вот UML Командного Pattern:

Command pattern in UML

Как вы можете видеть выше, Client напрямую соединен с ConcreteCommand и картина даже говорит, что создает их.

Каждый объект команды имеет различный вид и количество параметров.

Эта деталь затруднит отделить создание объекта от кода клиента.

Одним из простых способов является использование так называемого Simple Factory (aka Concrete Factory).

Simple Factory pattern with Command pattern

Намерение здесь инкапсулировать создание команд с использованием метода CommandFactory.createCommand(...). Клиентский код не хочет знать подробности о new CommandA(...) и т.д.

Однако так как конструктор для каждой конкретной команды имеет различные параметры, вам нужен клиент предоставить эту информацию в createCommand(...) метода. На мой взгляд, эта модель не принесет большой пользы, поскольку Клиент должен предоставить почти то же количество деталей с шаблоном или без него. Это может быть полезно, если вы не хотите, чтобы Клиент знал точные имена ConcreteCommands.

Например, без шаблона Simple Factory, Client должен был бы сделать new CommandA(arg1, arg2) (прямое соединение с конкретной командой). С шаблоном Simple Factory Client должен был бы сделать CommandFactory.createCommand("A", arg1, arg2), где «A» (или что-то подобное) является дискриминатором для создания ConcreteCommand. Если вы добавили CommandD к вашему дизайну, Client все равно нужно было изменить (ему нужно было бы позвонить createCommand("D", ...)) и вам нужно было бы обновить CommandFactory. Похоже на большую сложность для небольшой выгоды.

Использование фабричного метода или абстрактного шаблона фабрики кажется еще более сложным, но ваш вопрос не дает достаточно деталей, чтобы действительно знать наверняка.

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