傳統工廠使用 switch-case 根據鍵創建對象,派生類增多時代碼冗長難維護。自動註冊工廠利用靜態映射,派生類通過宏在加載時自動註冊創建函數,實現開閉原則。
template
class Factory {
using Creator = function;
map creators;
Factory() = default;
public:
static Factory& instance() {
static Factory factory;
return factory;
}
template
void reg(const K& key) {
creators[key] = []{ return new Derived; };
}
T* create(const K& key) {
auto it = creators.find(key);
return it != creators.end() ? it->second() : nullptr;
}
};
#define REGISTER_CLASS(Base, Derived, Key) \
namespace { \
struct Derived##_Registrar { \
Derived##_Registrar() { \
Factory ::instance().reg(Key); \
} \
} Derived##_registrar; \
}
class Object { public: virtual ~Object() {} };
#define FACTORY_OBJECT Factory