zoukankan      html  css  js  c++  java
  • 对于抽象工厂的封装

    对于抽象工厂的封装
    #ifndef _AbstractFactory_
    #define _AbstractFactory_
    
    #include <hash_map>
    
    /**
     *@brief 具体工厂类
     *@param Product 抽象产品
     *@param ConcreateProduct 具体产品
     */
    template <typename Product, typename ConcreateProduct>
    class ConcreateCreator
    {
    public:
        //生产具体产品
        static Product* CreateProduct()
        {
            return new ConcreateProduct();
        }
    };
    
    /**
     *@brief 
     */
    template <typename Product>
    class Creator
    {
    public:
        Creator(){}
        ~Creator(){}
    private:
        Creator(Creator&);
    
    public:
        /**
         *@brief 根据具体产品生成具体工厂,并注册进抽象工厂
         *@param    ConcreteProduct 具体产品
         */
        template<typename ConcreteProduct>
        void RegisterCreator(const int& _type)
        {
            m_ConcreteCreators[_type] = ConcreateCreator<Product, ConcreteProduct>::CreateProduct;
        }
    
        /**
         *@brief 删除所有具体工厂
         */
        void UnRegisterAllCreators()
        {
            m_ConcreteCreators.clear();
        }
    
        /**
         *@brief 生产_type类型的产品
         */
        Product* CreateProduct(const int& _type)
        {
            MapRegisterCreatorItem::iterator type = m_ConcreteCreators.find(_type);
            if (type != m_ConcreteCreators.end())
            {
                CreateProductDelegate create = type->second;
                if (create != 0)
                {
                    return create();
                }
            }
            return nullptr;
        }
    
    
    private:
        typedef Product* (*CreateProductDelegate)( ); // 生产产品的函数委托
        typedef stdext::hash_map<int, CreateProductDelegate> MapRegisterCreatorItem;
    
        MapRegisterCreatorItem m_ConcreteCreators; // 保存所有注册过的具体工厂
    };
    
    #endif
    
    
    #ifndef _Packet_
    #define  _Packet_
    
    #include <iostream>
    /**
     *@brief 包类型
     */
    enum PktType
    {
        ePktType_Login,
        ePktType_Logout,
    };
    
    /**
     *@brief 产品抽象类
     */
    class Packet
    {
    public:
        virtual void Send() = 0;
        virtual ~Packet() = 0;
    };
    
    inline Packet::~Packet()
    {
    
    }
    
    /**
     *@LoginPacket 具体产品类
     */
    class LoginPacket : public Packet
    {
    public:
        void Send()
        {
            std::cout << "Send Longin Packet" << std::endl;
        }
    };
    
    class LogoutPacket : public Packet
    {
    public:
        void Send()
        {
            std::cout << "Send Lonout Packet" << std::endl;
        }
    };
    
    
    
    #endif
    
    
    #include "AbstractFactory.h"
    #include "Packet.hpp"
    int main()
    {
        Creator<Packet>* pFactory = new Creator<Packet>;// 创建抽象工厂
    
        pFactory->RegisterCreator<LoginPacket>(ePktType_Login);//创建具体工厂,并注册进抽象工厂
        pFactory->RegisterCreator<LogoutPacket>(ePktType_Logout);//创建具体工厂,并注册进抽象工厂
    
        //抽象工厂创建具体产品
        Packet* pLoginPkt = pFactory->CreateProduct(ePktType_Login);
        Packet* pLogoutPkt = pFactory->CreateProduct(ePktType_Logout);
    
        pLoginPkt->Send();
        pLogoutPkt->Send();
    
        pFactory->UnRegisterAllCreators();
        delete pFactory;
        pFactory = nullptr;
    
        getchar();
        return 0;
    
    }
  • 相关阅读:
    Kubernetes Admission Controller解析
    容器化Node Exporter对主机磁盘使用率的监控问题
    Prometheus监控指标的label注入方法
    Prometheus告警模型分析
    Kubernetes Controller执行框架解析
    深入理解Istio核心组件之Pilot
    Prometheus存储模型分析
    如何利用Prometheus监控你的应用
    Prometheus在Kubernetes下的服务发现机制
    JSON字符串和js对象转换
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4354139.html
Copyright © 2011-2022 走看看