Задача моего класса по разработке программного обеспечения - разработать приложение, которое может играть в различные формы конкретной игры. Рассматриваемая игра - Манкала, некоторые из этих игр называются Вари или Калах. Эти игры отличаются в некоторых аспектах, но для моего вопроса важно знать, что игры могут отличаться в следующем:
- Способ обработки результата перемещения
- То, как определяется конец игры
- Способ определения победителя
Первое, что мне пришло в голову, чтобы разработать это, это использовать шаблон стратегии, у меня есть вариации в алгоритмах (фактические правила игры). Дизайн может выглядеть так:

Тогда я подумал про себя, что в игре Манкала и Вари способ определения победителя точно такой же, и код будет продублирован. Я не думаю, что это по определению нарушение принципа «одно правило, одно место» или принцип «СУХОЙ», поскольку изменение правил для Mancala не будет автоматически означать, что правило также должно быть изменено в Wari. Тем не менее, по отзывам, полученным от моего профессора, у меня сложилось впечатление найти другой дизайн.
Я тогда придумал это:

Каждая игра (Mancala, Wari, Kalah, ...) будет просто иметь атрибут типа интерфейса каждого правила, то есть, WinnerDeterminerи если есть версия Mancala 2.0, которая совпадает с Mancala 1.0, за исключением того, как определяется победитель, она может просто используйте версии Mancala.
Я думаю, что реализация этих правил как шаблон стратегии, безусловно, действительна. Но настоящая проблема возникает, когда я хочу разработать его дальше.
Читая о шаблонном методе pattern, я сразу подумал, что его можно применить к этой проблеме. Действия, которые выполняются, когда пользователь делает ход, всегда одинаковы и в одинаковом порядке, а именно:
- кладите камни в лунки (это одинаково для всех игр, поэтому будет реализовано в самом методе шаблона)
- определить результат переезда
- определить, закончилась ли игра из-за предыдущего хода
- если игра закончилась, определите, кто выиграл
Эти три последних шага - все в моей стратегии, описанной выше. У меня много проблем с объединением этих двух. Одним из возможных решений, которое я нашел, было бы отказаться от шаблона стратегии и сделать следующее:

Я действительно не вижу разницы в дизайне между шаблоном стратегии и этим? Но я уверен, что мне нужно использовать шаблонный метод (хотя я был точно так же уверен в необходимости использовать шаблон стратегии).
Я также не могу определить, кто будет отвечать за создание TurnTemplateобъекта, в то время как с помощью шаблона стратегии я чувствую, что у меня есть семейства объектов (три правила), которые я мог бы легко создать, используя абстрактный шаблон фабрики. Я бы тогда иметь MancalaRuleFactory, WariRuleFactoryи т.д. , и они будут создавать правильные примеры правил и руки меня обратно RuleSetобъект.
Допустим, я использую шаблон стратегии + абстрактная фабрика, и у меня есть RuleSetобъект, в котором есть алгоритмы для трех правил. Единственный способ, которым я чувствую, что все еще могу использовать шаблонный шаблонный метод с этим, состоит в том, чтобы передать этот RuleSetобъект моему TurnTemplate. Проблема, которая возникает тогда, в том, что мне никогда не понадобятся мои конкретные реализации TurnTemplate, эти классы устареют. В моих защищенных методах TurnTemplateя мог просто позвонить ruleSet.determineWinner(). Как следствие, TurnTemplateкласс больше не будет абстрактным, а должен стать конкретным, тогда он все еще будет шаблоном метода шаблона?
Подводя итог, я правильно думаю, или я что-то упускаю легко? Если я на правильном пути, как мне объединить шаблон стратегии и шаблонный метод?