Связанные/зависимые объекты в Абстрактной Фабрике
В определении шаблона «Абстрактная фабрика» говорится, что он предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.
Правильно ли использовать этот шаблон в следующей ситуации? Пример: Обе армии — абстрактные фабрики, создающие воина и целителя. Однако каждый конкретный целитель может лечить только соответствующего воина (поскольку для этого требуются методы, специфичные для их расы с разными возвращаемыми типами и/или сигнатурами). Однако для клиента они возвращают объекты, реализующие интерфейс целителя и воина. Правильно ли я понял концепцию создания связанных/зависимых объектов?
class Unit(ABC):
@abstractmethod
def attack(self):
pass
@abstractmethod
def move(self):
pass
class Warrior(Unit):
@abstractmethod
def taunt(self):
pass
class Healer(Unit):
@abstractmethod
def heal(self):
pass
class Army(ABC):
@abstractmethod
def create_warrior(self) -> Warrior:
pass
@abstractmethod
def create_healer(self) -> Healer:
pass
# Humans classes
class Human(ABC):
# Human specific method
def get_faith_level(self) -> int:
return self.faith_level
class Knight(Human, Warrior):
# Abstract methods realization ...
class Priest(Human, Healer):
# Abstract methods realization ...
# Can heal only Humans
def heal(self, human: Human):
faith = human.get_faith_level()
human.health += ... # Amount depending on faith level
class HumanArmy(Army):
def create_warrior(self) -> Warrior:
return Knight()
def create_healer(self) -> Healer:
return Priest()
# Orcs classes
class Orc(ABC):
# Orcs specific method
def get_ancestor_spirit_name(self): -> str
return self.ancestor_spirit_name
class OrcBerserk(Orc, Warrior):
# Abstract methods realization
class Shaman(Orc, Healer):
# Abstract methods realization
# Can heal only Orcs
def heal(self, orc: Orc):
spirit_name = orc.get_ancestor_spirit_name()
orc.health += ... # Amount depending on spirit bonus
class OrcsArmy(Army):
def create_warrior(self) -> Warrior:
return OrcBerserk()
def create_healer(self) -> Healer:
return Shaman()
# Client code
armies = {'Orcs': OrcsArmy, 'Humans': HumansArmy}
def start_game():
your_army_type = ... # Army type selection
army = armies[your_army_type]()
warrior = army.create_warrior()
healer = army.create_healer()
warrior.attack()
warrior.move()
warrior.taunt()
healer.move()
healer.heal(warrior)