我有一個基類Duck
,鴨類的工廠DuckFactory
和一個鴨子池DucksPool
。具有抽象基類的類的工廠庫
目前代碼看起來像你可以看到下面。我想要的是將工廠註冊到池中,然後只需從池中請求新的鴨子(字符串,如您在main()
中看到的那樣)。
然而,接下來的步驟是把Duck
在鹼抽象類型與附加純虛方法getCapabilities()
,並且對的Duck
具有不同能力,其工廠可以與該池被註冊的子類的打,並且可以是在運行時通過池通過相應的工廠請求(並實例化)。
我已經嘗試了不同的事情,但每次嘗試後都碰到了牆壁。
你能告訴我如何實現我剛剛描述的clean C++ 03-only代碼? (不是C++ 11或類似的,它應該只編譯爲g++ -Wall file.cpp
)。
沒有提升或類似的庫/框架,我想了解它是如何從「scratch」完成的。
只要滿足這些要求(管理並通過某些工廠從池中實例化鴨子),也歡迎其他設計方面的建議,並且可以通過「字符串名稱」實例化鴨子。
解決方案越乾淨越好。
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
//---------------------------------------
class Duck {
Duck() { }
public:
static Duck* newSelf() { return new Duck(); }
static char const* getName() { return "fooDuck"; }
void quack() { cout << "QUACK"; }
};
template <class TDuck> class DucksFactory {
char const* friendly_name;
public:
DucksFactory() : friendly_name(TDuck::getName()) {
}
TDuck* getNew() { return TDuck::newSelf(); }
char const* getName() const { return friendly_name; }
};
class DucksPool {
map<string, DucksFactory<Duck>*> factories;
public:
template <typename TDuck> void acknowledgeDuckType(DucksFactory<TDuck> *factory) {
factories[factory->getName()] = factory;
}
template <typename TDuck> void acknowledgeDuckFactory(void) {
DucksFactory<TDuck> *factory = new DucksFactory<TDuck>();
factories[factory->getName()] = factory;
}
template <typename TDuck> TDuck* getNew(string type) {
return dynamic_cast<TDuck*>(factories[type]->getNew());
}
Duck* getNew(string type) {
return factories[type]->getNew();
}
};
//---------------------------------------
int main(void) {
DucksPool *duckspool = new DucksPool();
//DucksFactory<Duck> *enten_factory = new DucksFactory<Duck>();
//duckspool->acknowledgeDuckType<Duck>(enten_factory);
duckspool->acknowledgeDuckFactory<Duck>();
Duck *foo = duckspool->getNew("fooDuck");
foo->quack();
delete foo;
//delete enten_factory;
delete duckspool;
return 0;
}
您可能意思是「C++ 03-only code」。 C++ 0x現在是C++,但編譯器還沒有趕上這個事實。 – aschepler
@aschepler:是的,修好了 – Flavius