【问题标题】:Abstract Factory in C++C++ 中的抽象工厂
【发布时间】:2018-01-15 10:58:34
【问题描述】:

我正在尝试理解抽象工厂模式,这是我的第一个近似值:

#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;
}

这就是我想要重现的内容:

我有编程经验,但我是模式新手,不确定这是否是最佳解决方案,或者即使它是一个好的解决方案。

我正在阅读有关游戏引擎架构的信息,但我陷入了困境,而不是错误,只是怀疑此练习的正确解决方案。这本书有一些基本的例子,但根本不够理解。

【问题讨论】:

  • 也许代码审查会是一个更好的地方来问这个问题。
  • 如果士兵的属性在兽人和人类之间设置不同会更有意义。
  • @dandan78 我不太确定,这看起来像是假设场景中的练习,代码审查doesn't handle well。这绝对不是生产中使用的代码,它根本没有做任何有用的事情。
  • 您可能对wizards and warriors 感兴趣。尽管使用了 C# 示例,但它说明了为什么游戏规则会为 OOP 语言制定糟糕的语言规则。
  • 我不认为这是题外话,OP 无法理解和实施特定案例的设计模式,而不是询问他的实施质量,我不认为这是工厂与抽象工厂问题的欺骗......

标签: c++ design-patterns abstract-factory


【解决方案1】:

这并不是abstract factory 的确切原因。在您的情况下,您需要这样的结构(图表最终有点太大,单击图像以原始分辨率查看):

这个想法是你有一个抽象类或接口家族(这里是单位、弓箭手、骑手等)和每个工厂类型的具体实现家族(人类实现、兽人实现等)。 )。游戏只使用抽象工厂接口,不需要关心实际类型,每个实现只需要提供自己的行为,便于扩展。

作为旁注,我在图中使用了covariant return types,因为 C++ 支持它(而不是,例如,C#)并且在这种情况下它似乎是有意义的(例如,基础工厂中的方法 makeArcher接口SoldierFactory 被声明为返回一个Archer 对象,但OrcSoldierFactory 中的相同方法返回一个OrcArcher),但这不是模式严格要求的。

【讨论】:

  • 谢谢,非常有用的信息,检查一下
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多