Корявая архитектура или Какой шаблон использовать?

Рейтинг: 1Ответов: 1Опубликовано: 29.03.2015

Имеется класс Rules, который имеет в себе кое-какой набор правил. Нескольк карт, пара примитивов и т.д.
Имеется интерфейс/абстрактный класс CellMatrix.
Имеется несколько его реализаций, которые в конструкторе принимают класс Rules для инициализации:

class CellMatrixArray implements CellMatrix{
   CellMatrixArray(Rules r){}
}
class MapMatrixArray implements CellMatrix{
   MapMatrixArray(Rules r){}
}

Имеется главный класс, который содержит этот CellMatrix. Реализация, конечно, же неизвестна.

class PlayerField{
   PlayerField(Rules r){}
   private CellMatrix matrix; //назначается сеттером или конструктором.
}

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

alt text

Создавать объекты CellMatrix внутри PlayerField не могу - нужно предусмотреть возможность наследования/смена реализации. Я вот думаю, может, абстрактную фабрику создать примерно такого вида:

interface CellMatrixFactory{
   void setRules(Rules r);
   CellMatrix createMatrix();
}

И отправлять эту фабрику в PlayerField. Т.е. я избавлюсь от того, чтобы отправлять Rules в несколько мест, отправлю один раз в PlayerField, вызову setRules у фабрики и создам CellMatrix.

Ответы

▲ 1

Для полноценного ответа не хватает данных.

Как PlayerField будет использовать CellMatrix?

Что такое и как связаны CellMatrix и Rules (точнее на что влияет набор правил внутри CellMatrix, где реализована данная логика)?

Выполняет ли CellMatrix какие то действия или только содержит данные для обработки?

Почему нельзя иметь метод CellMatrix.getRules(), который вернет PlayerField те правила, которые актуальны для данного объекта CellMatrix? Тогда не нужно городить огородов с шаблонами.

Является ли CellMatrix составной частью PlayerField или только используется последним для обработки каких то данных внутри CellMatrix?

Вообщем, чтобы было можно вам что то посоветовать дайте больше информации.