C++ 中的抽象工厂
Abstract Factory in 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;
}
这是我要重现的:
我有编程经验,但我是模式方面的新手,不确定这是否是最佳解决方案,甚至不确定它是否是一个好的解决方案。
我正在阅读有关游戏引擎架构的内容,但我被困在这个问题上,不是因为错误,只是怀疑这个练习的正确解决方案。书中有基本的例子,但根本看不懂。
abstract factory 并非如此。在您的情况下,您需要这样的结构(图表最终有点太大,单击图像以其原始分辨率查看):
我们的想法是,您有一组抽象 类 或接口(这里是单位、弓箭手、骑手等)和一组针对每种类型工厂的具体实现(针对人类的实现,兽人等的实现)。游戏只使用抽象工厂接口,不需要关心实际类型是什么,而每个实现只需要提供自己的行为,便于扩展。
作为旁注,我在图中使用了 covariant return types,因为 C++ 支持它(与 C# 相对)并且在这种情况下似乎有意义(例如方法 makeArcher
在基础工厂接口 SoldierFactory
中声明为 return 一个 Archer
对象,但在 OrcSoldierFactory
return 中声明为一个 OrcArcher
的相同方法) ,但这并不是模式的严格要求。
我正在尝试理解抽象工厂模式,这是我的第一个近似值:
#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;
}
这是我要重现的:
我有编程经验,但我是模式方面的新手,不确定这是否是最佳解决方案,甚至不确定它是否是一个好的解决方案。
我正在阅读有关游戏引擎架构的内容,但我被困在这个问题上,不是因为错误,只是怀疑这个练习的正确解决方案。书中有基本的例子,但根本看不懂。
abstract factory 并非如此。在您的情况下,您需要这样的结构(图表最终有点太大,单击图像以其原始分辨率查看):
我们的想法是,您有一组抽象 类 或接口(这里是单位、弓箭手、骑手等)和一组针对每种类型工厂的具体实现(针对人类的实现,兽人等的实现)。游戏只使用抽象工厂接口,不需要关心实际类型是什么,而每个实现只需要提供自己的行为,便于扩展。
作为旁注,我在图中使用了 covariant return types,因为 C++ 支持它(与 C# 相对)并且在这种情况下似乎有意义(例如方法 makeArcher
在基础工厂接口 SoldierFactory
中声明为 return 一个 Archer
对象,但在 OrcSoldierFactory
return 中声明为一个 OrcArcher
的相同方法) ,但这并不是模式的严格要求。