Итак, вы знаете, что вам нужен космический корабль. К этому космическому кораблю будут прикреплены различные гаджеты, так что вы можете захотеть что-то подобное:
class Spaceship {
public:
void add(Gadget*);
};
возможно, будет другой корабль, поэтому космический корабль будет базовым классом для иерархии. Например, у вас будут разведывательные корабли, военные корабли, быстрый перехватчик и т. Д.
Что касается гаджета, возможно, они улучшат некоторые свойства космического корабля, поэтому вам необходимо знать их заранее . Я предполагаю, что у них будет максимальная скорость, грузоподъемность и так далее. Я бы добавил их в класс Spaceship, который будет выглядеть так:
class Spaceship {
public:
void add(Gadget*);
long getMaxSpeed() const;
long getCargoCapacity() const;
long getRadarRange() const;
};
Каждый космический корабль будет иметь разные базовые значения для этих свойств, которые вы можете варьировать в зависимости от установленных гаджетов. Таким образом, они дадут бонус или малус указанным свойствам:
class SpaceshipGadget {
public:
long getSpeedBonus() const; // this can be positive or negative
long getCargoBonus() const;
long getRadarBonus() const;
};
Может быть, вам даже не нужна иерархия гаджетов: если они дают только бонус / малус, вы можете назначить их через конструктор, и все готово.
Теперь где-то в коде вам придется строить космические корабли, создавать гаджеты и прикреплять их к космическому кораблю (см. Метод Spaceship::add
). Я полагаю, что запрос, который инициирует процесс построения, будет исходить из пользовательского интерфейса, поэтому вы точно будете знать, какой гаджет понадобится пользователю, поскольку он / она выберет из списка, который вам нужно отобразить.
В конце концов вы получите фабрику для космического корабля и фабрику для гаджетов. У космического корабля один будет много таких методов, как
SpaceshipFactory {
public:
Spaceship* buildCargo();
Spaceship* buildWarship();
};
GadgetFactory {
public:
Gadget* buildEnhancedRadar();
Gadget* buildAntigravityCannons();
};
В любом случае, вам нужно усовершенствовать свой дизайн, прежде чем думать о шаблонах кода. Если вам сложно объяснить другим, чего вы пытаетесь достичь, значит, на картинке чего-то не хватает.