• 对于抽象工厂的封装


    对于抽象工厂的封装
    #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;
    
    }
  • 相关阅读:
    oracle 表误更新 (flashback )闪回操作
    经典sql语句大全
    如何让程序自动更新
    C#如何测试代码运行时间
    oracle复制表的sql语句
    NeatUpload的安装使用 文件上传。可传大文件。
    c#实现ftp上传代码
    C# ftp 上传、下载、删除
    oracle cursor 与refcursor及sys_refcursor的区别 -游标(cursor)应用-实例
    Oracle中Merge语句的使用
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4354139.html
Copyright © 2020-2023  润新知