Абстрактная фабрика в C++

Я пытаюсь понять абстрактный шаблон фабрики, вот мое первое приближение:

#include <iostream>
using namespace std;

class Soldier
{
    public:
    virtual void shoot()=0;
};

class Archer: public Soldier
{
    public:
    void shoot(){
        cout<<"Archer shoot"<<endl;
    }
};

class Rider: public Soldier
{
    public:
    void shoot(){
        cout<<"Rider shoot"<<endl;
    }
};

class AbstractFactory
{
    public:
    virtual Soldier* createArcher()=0;
    virtual Soldier* createRider()=0;
};

class OrcFactory: public AbstractFactory
{
    Soldier* createArcher()
    {
        return new Archer();
    };
    Soldier* createRider()
    {
        return new Rider();
    };
};

class HumanFactory: public AbstractFactory
{
    Soldier* createArcher()
    {
        return new Archer();
    };
    Soldier* createRider()
    {
        return new Rider();
    };
};

class Game
{

    public:
    AbstractFactory* factory;
    Game(AbstractFactory* factory):factory(factory){};
};

int main()
{
    Game* game = new Game(new HumanFactory);
    Archer* HumanArcher = static_cast <Archer*>(game->factory->createArcher());
    Rider* humanRider = static_cast <Rider*>(game->factory->createRider());
    HumanArcher->shoot();
    humanRider->shoot();
    return 0;
}

Это то, что я хочу воспроизвести:

диаграмма классов

У меня есть опыт программирования, но я новичок с шаблонами, не уверен, что это оптимальное решение или даже хорошее решение.

Я читаю об архитектуре игрового движка, но я застрял в этом, не из-за ошибок, просто сомневаюсь в правильном решении для этого упражнения. В книге есть основные примеры, но их недостаточно, чтобы понять это.

1 ответ

Решение

Это не совсем то, что делает абстрактную фабрику. В вашем случае вам понадобится такая структура (диаграмма оказалась слишком большой, щелкните изображение, чтобы увидеть его в исходном разрешении):

Абстрактный фабричный образец

Идея состоит в том, что у вас есть семейство абстрактных классов или интерфейсов (здесь - unit, archer, rider и т. Д.) И семейство конкретных реализаций для каждого типа фабрики (реализации для людей, реализации для орков и т. Д.). В игре используется только абстрактный интерфейс фабрики, и не нужно заботиться о том, какие типы являются действительными, в то время как каждая реализация должна обеспечивать только свое поведение, что позволяет легко расширять ее.

В качестве примечания я использовал ковариантные возвращаемые типы на диаграмме, потому что C++ поддерживает его (в отличие, например, от C#), и в этом случае, похоже, имеет смысл (например, метод makeArcher в базовом заводском интерфейсе SoldierFactory объявлено о возвращении Archer объект, но тот же метод в OrcSoldierFactory возвращает OrcArcher), но это не является обязательным требованием шаблона.

Другие вопросы по тегам