美文网首页
【Poco笔记】根据名字动态生成类对象实例

【Poco笔记】根据名字动态生成类对象实例

作者: 安安爸Chris | 来源:发表于2018-12-31 10:07 被阅读0次

高级语言里如java有反射,可以根据类名动态生成类实例;也可以动态获取类成员变量和函数。

Poco里是否有类似功能呢? 对于前者,根据类名动态生成类实例。Poco提供了类似的功能。

它就是模板类DynamicFactory

它的原理很简单,通过注册名字,将名字与类型储存在map中。使用的时候根据名字找寻对应的类型,然后生成该类型的实例。

我们来看一下使用。 定义两个类A,B都集成基类Base

    class Base
    {
    public:
        Base()
        {
        }
        
        virtual ~Base()
        {
        }
    };
    
    class A: public Base
    {
    };
    
    class B: public Base
    {
    };

使用Dynamic注册

    DynamicFactory<Base> dynFactory;
    
    dynFactory.registerClass<A>("A");
    dynFactory.registerClass<B>("B");
    
    assert (dynFactory.isClass("A"));
    assert (dynFactory.isClass("B"));
    
    assert (!dynFactory.isClass("C"));

    std::unique_ptr<A> a(dynamic_cast<A*>(dynFactory.createInstance("A")));
    std::unique_ptr<B> b(dynamic_cast<B*>(dynFactory.createInstance("B")));

    try{
        dynFactory.registerClass<A>("A");
        fail("already registered - must throw");
    }
    catch (Poco::ExistsException&)
    {
    }
    
    dynFactory.unregisterClass("B");
    assert (dynFactory.isClass("A"));
    assert (!dynFactory.isClass("B"));

    try
    {
        std::unique_ptr<B> b(dynamic_cast<B*>(dynFactory.createInstance("B")));
        fail("unregistered - must throw");
    }
    catch (Poco::NotFoundException&)
    {
    }

DynamicFactory的模板是基类类型,注册时使用子类类型。


看一下源码的实现原理。
在DynamicFactory中定义了实现工厂的接口AbstractInstantiator,然后在map中存储名字和AbstractInstantiator键值对。就这么简单!

template <class Base>
class DynamicFactory
{
public:
// 定义了抽象方法
typedef AbstractInstantiator<Base> AbstractFactory


private:
    typedef std::map<std::string, AbstractFactory*> FactoryMap;
    
    FactoryMap _map; // 基本原理就是将类名称和类型存储在map中
    mutable FastMutex _mutex;
}

那么AbstractFactory是什么呢?说白了,它就是一个接口,定义了行为。

template <class Base>
class AbstractInstantiator
{
    // 通过该接口定义实现实例,返回基类指针
    virtual Base* createInstance() const = 0;
}

具体的类是Instantiator,跟AbstractFactory定义在一起。

template <class C, class Base>
class Instantiator: public AbstractInstantiator<Base>
{
public:
    // 哦,原来如此。就这么简单
    Base* createInstance() const
    {
        return new C;
    }
}

所以从源码上来看,DynamicFactory中的模板类跟注册类可以是继承关系,也可以是同一个类型。

相关文章

  • 【Poco笔记】根据名字动态生成类对象实例

    高级语言里如java有反射,可以根据类名动态生成类实例;也可以动态获取类成员变量和函数。 Poco里是否有类似功能...

  • ABAP面相对象

    类 对象 方法 继承 接口 事件 类生成器 实例: 根据类创建过程中为实例化,且根据类的创建对象为实例,对象代表所...

  • KVO与KVC原理

    KVO 1:实现原理 对实例对象属性监听,会利用runtime动态生成一个类NSKVONotifying_Clas...

  • Java的Class对象

    1. Class对象和实例对象 实例对象是类的实例,基于某个类 new 出来的对象Class对象是JVM生成用来保...

  • [iOS] 根据类名字符串动态创建类的实例对象

    通过类名字符串创建类的实例对象,在OC和Swift均可实现, 下面分别介绍其方法,以动态创建“ ViewContr...

  • python根据类名动态生成类实例的方法的代码

    如下代码内容是关于python根据类名动态生成类实例的方法的代码,应该对码农也有好处。 #modulePath是模...

  • 消息转发流程

    实例方法的流程 对象实例收到消息(SEL+参数) 根据存储在对象实例中的ISA到类对象,类对象依次查找Class ...

  • 动态代理学习记录

    JDK动态代理 使用 首先定义一个接口类 再定义实现该接口的类,用以生成需要被代理的实例对象 使用Invocati...

  • 面向对象2

    生成式和生成器 1.生成式和生成器 2.面向对象类和对象类:拥有相同属性和功能的对象的集合(抽象的)对象:类的实例...

  • 有关类和对象

    类和对象 -class object-类是对象的抽象,对象是类的实例 属性 -静态特征 行为 动态特征...

网友评论

      本文标题:【Poco笔记】根据名字动态生成类对象实例

      本文链接:https://www.haomeiwen.com/subject/vpqclqtx.html