C++   类工厂实现动态对象创建

看了MFC中的动态创建对象后,感觉动态创建对象算是一种技术吧,理论上说算是一种设计模式。其实创建的原理很明了,把对象的类别名称和其构造函数用容器记录下来,在需要的时候给出创建类别查找容器即可创建对象。当然这里我们需要自定义一个全局的函数指针用来指向类别的构造函数。在这里我们使用类工厂模式,在泪工厂中我们定义一个通用构造函数,将函数指针指向它。下面是参考一位网友思路来整理和摸索的代码:

//通用的函数指针

typedef  void *(*CREATE_FUNC)();

//创建类的工厂类

class DynObjectFactory
{
public:
    static void *CreateObject( const string &name)
    {
        map<string, CREATE_FUNC>::const_iterator it;
        it = mapCls_.find(name);
        if (it == mapCls_.end())
            return  0;
        else
            return it->second();  //func();
    }

    static void Register( const string &name, CREATE_FUNC func)
    {
        mapCls_[name] = func;
    }
private:
    static map<string, CREATE_FUNC> mapCls_;
};

//头文件被包含多次,也只定义一次mapCls_;
__declspec(selectany) map<string, CREATE_FUNC> DynObjectFactory::mapCls_;

class Register
{
public:
    Register( const string &name, CREATE_FUNC func)
    {
        DynObjectFactory::Register(name, func);
    }
};

#define REGISTER_CLASS(class_name)     class class_name##Register {     public:     static  void* NewInstance()     {  return  new class_name;  }     private:     static Register reg_;     };     Register class_name##Register::reg_(#class_name, class_name##Register::NewInstance)
//CircleRegister

//下面是测试类 *.h

class Shape
{
public:
     virtual  void Draw() =  0;
     virtual ~Shape() {}
};

class Circle :  public Shape
{
public:
     void Draw();
    ~Circle();
};

class Square :  public Shape
{
public:
     void Draw();
    ~Square();
};

class Rectangle :  public Shape
{
public:
     void Draw();
    ~Rectangle();
};

//*.cpp

void Circle::Draw()
{
    cout <<  "Circle::Draw() ..." << endl;
}
Circle::~Circle()
{
    cout <<  "~Circle ..." << endl;
}

void Square::Draw()
{
    cout <<  "Square::Draw() ..." << endl;
}
Square::~Square()
{
    cout <<  "~Square ..." << endl;
}

void Rectangle::Draw()
{
    cout <<  "Rectangle::Draw() ..." << endl;
}

Rectangle::~Rectangle()
{
    cout <<  "~Rectangle ..." << endl;
}

REGISTER_CLASS(Circle);
REGISTER_CLASS(Square);
REGISTER_CLASS(Rectangle);

//main.cpp

void DrawAllShapes( const vector<Shape *> &v)
{
    vector<Shape *>::const_iterator it;
     for (it = v.begin(); it != v.end(); ++it)
    {
        (*it)->Draw();
    }
}
void DeleteAllShapes( const vector<Shape *> &v)
{
    vector<Shape *>::const_iterator it;
     for (it = v.begin(); it != v.end(); ++it)
    {
         delete(*it);
    }
}
int main( void)
{
    vector<Shape *> v;
    Shape *ps;
    ps =  static_cast<Shape *>(DynObjectFactory::CreateObject( "Circle"));
    v.push_back(ps);
    ps =  static_cast<Shape *>(DynObjectFactory::CreateObject( "Square"));
    v.push_back(ps);
    ps =  static_cast<Shape *>(DynObjectFactory::CreateObject( "Rectangle"));
    v.push_back(ps);
    DrawAllShapes(v);
    DeleteAllShapes(v);
    return  0;
}
时间: 2024-10-10 15:10:48

C++   类工厂实现动态对象创建的相关文章

动态对象创建(二)重载new和delete

前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常我们为了一些目的而使用new和delete的内存分配系统,但是在特殊情况下,它并不能够满足需要.最常见的改变分配系统的原因是出于效率考虑:也许要创建和销毁一个特定的类的非常多的对象以至于这个运算变成了速度的瓶颈.C++允许重载new和delete来实现我们自己的存储分配方案,所以可以用它来处理问题. 另一个问题就是堆碎片:分配不同大小的内存可

动态对象创建

C++的动态对象创建 对象创建 当创建一个C++对象时,会发生两件事: (1)为对象分配内存 (2)调用构造函数来初始化那个内存 然而,为对象分配内存可以用以下几种方式或在可选择的时间发生: (1)在静态存储区域,存储空间在程序开始之前就可以分配.这个存储空间在整个运行期间都存在. (2)无论何时到达一个特殊的执行点(左大括号)时,存储单元都可以在栈上被创建.出了执行点(右大括号),这个存储单元自动被释放.这些栈分配运算内置于处理器的指令集中,非常有效.但是,在写程序的时候,必须知道需要多少个存

Factory Method(工厂方法)-对象创建型模式

1.意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. 2.动机 框架使用抽象类定义和维护对象之间的关系.这些对象的创建通常也由框架负责. 3.适用性 当一个类不知道它所必须创建的对象的类的时候. 当一个类希望由它的子类来指定它所创建的对象的时候. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一局部化的时候. 4.结构 5.代码实例 class Product { public: vir

《C++编程思想》 第十二章 动态对象创建 (习题+解答)

一.相关知识点 重载new和delete 当创建一个new表达式时有两件事发生.首先,使用运算符new分配内存,然后调用构造函数.在delete表达式里,调用析构函数,然后使用运算符delete释放内存.我们永远无法控制构造函数和析构函数的调用(否则我们可能意外地搅乱它们),但可以改变内存分配函数运算符new和delete. 被new和delete使用的内存分配系统是为通用目的而设计的.但在特殊的情形下,它不能满足我们的需要.改变分配系统的原因是考虑效率:我们也许要创建和销毁一个特定的类的非常多

应用程序各对象创建的顺序

应用程序对象时全局对象,它在启动之前由系统创建.应用程序启动之后,程序的主函数首先调用应用程序对象的初始化函数InitInstace(),并在该函数中创建文档模板对象 CSingleDocTemplate *pDocTemplate;//声明文档模板指针(单文档)     pDocTemplate = new CSingleDocTemplate(//创建文档模板对象         IDR_MAINFRAME,//文档模板使用的资源ID         RUNTIME_CLASS(CNOTED

Objective-C设计模式——工厂方法模式virtual constructor(对象创建)

工厂方法模式 工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象. 工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到其子类. 工厂方法的工厂其实是多太的一个经典应用,而其生产的产品取决于使用什么工厂,符合面向对象设计的开放封闭原则,添加产品只需要添加新的类,而不需要修改原有的代码. 使用场景 1.编译时无法准确预期要创建的对象的类: 2.类想让其子类决定在运行时创见什么: 3.类有若干辅助类为其子类,

24-oc类工厂方法和类对象基本概念

类工厂方法 用于快速创建对象的类方法, 我们称之为类工厂方法 类工厂方法应用场景 类工厂方法中主要用于给对象分配存储空间和初始化这块存储空间 类工厂方法使用规范 规范: 一定是类方法 + 方法名称以类的名称开头, 首字母小写 一定有返回值, 返回值是id/instancetype 在类工厂方法实现中,调用本类的构造方法,创建实例对象,并返回实例对象 自定义类工厂方法是苹果的一个规范, 一般情况下, 我们会给一个类提供自定义构造方法和自定义类工厂方法用于创建一个对象 类工厂方法在继承中的注意点 以

动态类(类工厂)总结

动态类(类工厂)总结 一.动态类的作用 动态类应用的一个类似的例子便是MFC中CWnd类的Create方法,其第一个参数为Window Class的名字,这就允许用户通过class的名字来创建相应的窗口.C++不是动态语言,所以没法从语言机制上实现类的动态创建,但很明显这样的需求是存在的. 要想实现这一点,必须有一个“管理中心”,用于登记类的名字,并且通过名字能够调用某个方法来创建相应的类.结合类工厂的设计思想,这里我们让一套继承体系中的基类作为“管理中心”,由它来维护所有派生类的必要信息,包括

Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)

抽象工厂模式 理解了工厂方法模式,其实抽象工厂和工厂方法模式有很多的相似之处.抽象工厂同样是分离客户端对象的创建和逻辑代码的,但是抽象工厂往往是产生一组数据而不单单是产生一个产品. 抽象工厂提供一个创建一系列相关或相互依赖对象接口,而无需制定它们具体的类. 抽象工厂与工厂方法 抽象工厂 通过对象组合创建抽象产品 创建多系列产品 必须修改父类的接口才能支持新的产品 工厂方法 通过类继承创建抽象产品 创建一种产品 子泪花创建者并重载工厂方法以创建新产品 Demo 比较多就不一一的贴代码了,截类图 客