首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 實現自動註冊工廠模式:基於映射與 Lambda 的類創建

     編輯:關於C++

動機

傳統工廠使用 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

class Widget : public Object {
public:
    Widget() { cout << "Widget created" << endl; }
};
REGISTER_CLASS(Object, Widget, "Widget");

int main() {
    Object* obj = FACTORY_OBJECT::instance().create("Widget");
    // 使用 obj...
    delete obj;
    return 0;
}


優勢

  • 新增派生類無需修改工廠代碼。
  • 映射查找 O(log n),Lambda 捕獲創建邏輯。
  • 宏簡化註冊樣板代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved