factory. , if/else.
Image "". , .
:
class Media {
public:
virtual Save() = 0;
};
class Image : public Media {
public:
Image() { }
virtual Save() { ... }
};
class Sound : public Media {
public:
Sound() { }
virtual Save() { ... }
};
- factory:
Media *CreateMedia(const string &type) {
if (type == "Image") {
return new Image;
} else if (type == "Sound") {
return new Sound;
} else {
}
}
, CreateMedia , factory/registry :
template <typename T>
struct CreatorFunction {
Media *operator() {
return new T;
}
};
class Factory {
public:
static Factory* Get() {
static Factory* f = new Factory;
return f;
}
Media* Create(const string& name) { return registry_[name](); }
void Add(const string& name, const CreatorFunction &func) {
registry_.insert(name, func);
}
private:
Factory() { }
hash_map<string, CreatorFunction> registry_;
};
#define REGISTER_MEDIA(type) Factory::Get()->Add(#type, CreatorFunction<type>);
REGISTER_MEDIA(Image);
REGISTER_MEDIA(Sound);
int main(int argc, char** argv) {
string parsedIn = "Image";
Factory::Get()->Create(parsedIn);
}
, , , . , if/then, - . , , .