zoukankan      html  css  js  c++  java
  • 工厂模式,根据ID创建对应的实例类

    工厂模式,根据ID创建对应的实例类

    //
    //  main.cpp
    //  TestCPP1
    //
    //  Created by bianchx on 15/4/27.
    //  Copyright (c) 2015年 bianchx. All rights reserved.
    //
    
    #include <iostream>
    #include <map>
    
    class BaseClass
    {
    public:
        virtual void print()
        {
            std::cout << __FUNCTION__ << std::endl;
        }
    };
    
    
    typedef BaseClass *(*CreateBase)();
    
    static std::map<long, CreateBase> _map;
    
    class Factory
    {
    public:
        
        static BaseClass *createInstanse(long id)
        {
            return _map.find(id)->second();
        }
    };
    
    template <typename T>
    struct ClassRegister:BaseClass {
        ClassRegister(long _id)
        {
            _map[_id] = &(ClassRegister::createT);
        }
        
        static BaseClass* createT()
        {
            return new T();
        }
    };
    
    class ClassA:public BaseClass
    {
    public:
        static ClassRegister<ClassA> reg;
        
        virtual void print()
        {
            std::cout << "ClassA" << std::endl;
        }
    };
    
    ClassRegister<ClassA> ClassA::reg(1);
    
    class ClassB:public BaseClass
    {
    private:
        static ClassRegister<ClassB> reg;
    public:
        virtual void print()
        {
            std::cout << "ClassB" << std::endl;
        }
    };
    
    ClassRegister<ClassB> ClassB::reg(2);
    
    
    int main(int argc, const char * argv[]) {
        
        Factory::createInstanse(1)->print();
        Factory::createInstanse(2)->print();
        
        return 0;
    }
    

      

  • 相关阅读:
    小记2_finddata_t结构体
    小记1
    2014-1-2 笔记
    _RecordsetPtr的 open函数
    SAFEARRAY
    用VC实现特定编辑框上对回车键响应
    常用控件的常用消息
    单文档与多文档
    java中得到json格式的数据
    form表单验证时的onsubmit事件
  • 原文地址:https://www.cnblogs.com/anxin1225/p/4462404.html
Copyright © 2011-2022 走看看