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;
    }





  • 相关阅读:
    Vue 2.x windows环境下安装
    VSCODE官网下载缓慢或下载失败 解决办法
    angular cli 降级
    Win10 VS2019 设置 以管理员身份运行
    XSHELL 连接 阿里云ECS实例
    Chrome浏览器跨域设置
    DBeaver 执行 mysql 多条语句报错
    DBeaver 连接MySql 8.0 报错 Public Key Retrieval is not allowed
    DBeaver 连接MySql 8.0报错 Unable to load authentication plugin 'caching_sha2_password'
    Linux系统分区
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3258254.html
Copyright © 2011-2022 走看看