zoukankan      html  css  js  c++  java
  • An extensible Factory Pattern example

    I have read the book Api Design For C++ recently , and I must say that it is a masterpiece.
    There is a section to introduce the Factory Pattern, I think it is the best practical example for this pattern which I have read.
    So I code it according the example, made little modification and added some annotation, then now share with you guys.

    Example from:  
    Api Design For C++, Martin Reddy
    Section: 3.3.3 Extensible Factory Example


    renderer.h
    #include <iostream>
    #include <string>

    class IRenderer
    {
    public:
        virtual void Render()=0;
        virtual ~IRenderer()
        {
            std::cout<< "delete IRenderer object."<<std::endl;
        }
    };

    class UserRenderer:public IRenderer
    {
    public:
        ~UserRenderer() 
        {
            std::cout<< "delete UserRenderer object."<<std::endl;
        }
        bool LoadScene(const std::string &filename) 
        { 
            return true; 
        }

        void SetViewportSize(int w, int h) {}
        void SetCameraPosition(double x, double y, double z) {}
        void SetLookAt(double x, double y, double z) {}
        void Render() 
        { 
            std::cout << "User Render" << std::endl; 
        }
        
        static IRenderer* Create() 
        { 
            return new UserRenderer(); //Pay attention: this method must be static.
        }
        
    };



    rendererfactory.h

    #include "renderer.h"
    #include <string>
    #include <map>

    class RendererFactory
    {
    public:
        typedef IRenderer* (*CreateCallback)();
        static void RegisterRenderer(const std::string& type, CreateCallback cb);
        static void UnregisterRender(const std::string& type);
        static IRenderer* CreateRenderer(const std::string& type);

    private:
        typedef std::map<std::string, CreateCallback> CallbackMap;
        static CallbackMap mRenderers;
    };


    rendererfactory.cpp
    #include "rendererfactory.h"

    RendererFactory::CallbackMap RendererFactory::mRenderers;

    void RendererFactory::RegisterRenderer(const std::string &type, RendererFactory::CreateCallback cb)
    {
        mRenderers[type] = cb;
    }

    void RendererFactory::UnregisterRender(const std::string &type)
    {
        mRenderers.erase(type);
    }

    IRenderer* RendererFactory::CreateRenderer(const std::string &type)
    {
        CallbackMap::iterator it = mRenderers.find(type);
        if(it!=mRenderers.end())
        {
            return (it->second)();
        }
        return NULL;
    }



    mainFile.cpp
    #include <iostream>
    #include "rendererfactory.h"

    using namespace std;

    int main()
    {
        //Register a new renderer
        RendererFactory::RegisterRenderer("user", UserRenderer::Create);

        //create an instance of our new renderer
        IRenderer* render = RendererFactory::CreateRenderer("user");
        render->Render();
        delete render; //Remember to release the resources on heap.

        getchar()
        return 0;
    }





  • 相关阅读:
    HTML <h1>
    HTML <body> 标签
    如何挑选深度学习 GPU?
    视频动作定位的分层自关注网络:ICCV2019论文解析
    三维点云去噪无监督学习:ICCV2019论文分析
    摄像头定位:ICCV2019论文解析
    深度学习扫地机器人
    细粒度语义分割:ICCV2019论文解析
    目标形体形状轮廓重建:ICCV2019论文解析
    2-2.5-3D的室内场景理解
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3258254.html
Copyright © 2011-2022 走看看