• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

碧海无波,细水长流

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

关于抽象工厂类的一个实际使用说明

各位看官好,最近我在apollo源码上看到一个这样的源码,我把这个源码拿下来做一个简单的需求。

  需求:假如我们现在要做一个动态加载动态库的管理框架,我们的动态库中有一些基类和派生类,同时我们还需要在我们实际使用中保证有些类可以动态调用动态库中的一些类,那么这样我们应该如何写框架呢?这里我们可以提供一个思路。

  我们整体设计4个大类:

    1、基类,我们假定他为AbstractClassFactoryBase,这个类没有任何的实际作用,我们仅仅当他是接口类,其中包括:

      1、AddOwnedClassLoader() // 添加我们实际使用的类

      2、RemoveOwnedClassLoader()  // 移除我们实际使用的类

           3、IsOwnedBy()   // 判断这个loader是不是属于这个库的类

      4、SetRelativeLibraryPath() // 记录当前库的读取路径

      5、GetBaseClassName()  // 获取当前基类的名称

      6、GetClassName() //获取当前类的名称

       2、管理工厂类

      我们叫它template <typename Base> AbstractClassFactory,这个类的作用是为了子类注册,我们要把所有继承这个类的子类来进行保存到一个数据结构中

        1、virtual createobj() = 0;  // 创建一个虚函数,让他生成对象

     3、实际工厂类

      我们叫它template <typename Derived, typename Base> ConcreteClassFactory,这个类就是实际管理具体对象的管理类,里面只有一个函数

        virtual *createobj()  { return new Derived();}

   4、注册类

        我们叫它Class Registry,这个类的作用就是将基类名称和里面的派生类做一个绑定,里面最重要的数据结构

      std::map<std::string,std::vector<AbstractClassFactoryBase*>> registry_;

     里面所有的数据结构增删改查都是围绕着registry_这个数据结构

 

最后这里添加一个实际注册宏

  

// 自动注册宏
#define REGISTER_CLASS(BaseClass, DerivedClass) \
    class DerivedClass##FactoryRegistrar { \
    private: \
        static ConcreteClassFactory<DerivedClass, BaseClass> factory; \
    public: \
        DerivedClass##FactoryRegistrar() { \
            factory.SetRelativeLibraryPath(GetCurrentLibraryName()); \
            ClassRegistry::GetInstance().RegisterFactory(&factory); \
        } \
    }; \
    ConcreteClassFactory<DerivedClass, BaseClass> \
        DerivedClass##FactoryRegistrar::factory; \
    static DerivedClass##FactoryRegistrar \
        DerivedClass##FactoryRegistrar_instance;

static 创建对象会直接创建构造函数

 

posted on 2025-12-31 11:09  碧海无波,细水长流  阅读(3)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3