Связанные/зависимые объекты в Абстрактной Фабрике

В определении шаблона «Абстрактная фабрика» говорится, что он предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.

Правильно ли использовать этот шаблон в следующей ситуации? Пример: Обе армии — абстрактные фабрики, создающие воина и целителя. Однако каждый конкретный целитель может лечить только соответствующего воина (поскольку для этого требуются методы, специфичные для их расы с разными возвращаемыми типами и/или сигнатурами). Однако для клиента они возвращают объекты, реализующие интерфейс целителя и воина. Правильно ли я понял концепцию создания связанных/зависимых объектов?

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)

Ответы (0 шт):