zoukankan      html  css  js  c++  java
  • 抽象工厂例子

    //简单工厂
    /*
    当新添加一个操作时,需要添加新的实现类和在工厂方法的switch中添加,打破了开放封闭原则
    */
    #if 0
    class operation
    {
    public:
        virtual int  GetResult(int nParam1, int nParam2) = 0;
    };
    
    enum Oper
    {
        eOper_Add,
        eOper_Sub,
    };
    
    class operationAdd : public operation
    {
        int GetResult(int nParam1, int nParam2)
        {
            return nParam1 + nParam2;
        }
    };
    
    class operationSub : public operation
    {
        int GetResult(int nParam1, int nParam2)
        {
            return nParam1 - nParam2;
        }
    };
    
    class Factory
    {
    public:
        operation* CreateOperate(Oper oper);
    };
    
    operation* Factory::CreateOperate(Oper oper)
    {
        switch (oper)
        {
        case eOper_Add:
            return new operationAdd;
            break;
        case eOper_Sub:
            return new operationSub;
            break;
        default:
            break;
        }
        return nullptr;
    }
    
    int main()
    {
        Factory fa;
        operation* op = fa.CreateOperate(eOper_Add);
        int sum = op->GetResult(1, 2);
        return 0;
    }
    
    #endif
    
    //工厂方法
    #if 0
    /*
    1.定义创建对象的接口,让子类决定实例化哪一个类
    2.将简单工厂改变成一个抽象工厂和多个具体生产对象的工厂
    3.当我们需要添加新产品时,需要添加产品类和相应的具体工厂类
    4.工厂方法是由使用者决定实例化哪一个工厂,简单工厂在内存自己判断逻辑,而现在是把这个逻辑放在了使用者身上
    
    缺点:
    没增加一个产品就需要增加一个产品工厂的类
    */
    
    class operation
    {
    public:
        virtual int  GetResult(int nParam1, int nParam2) = 0;
    };
    
    /// 具体产品类
    class operationAdd : public operation
    {
        int GetResult(int nParam1, int nParam2)
        {
            return nParam1 + nParam2;
        }
    };
    
    class operationSub : public operation
    {
        int GetResult(int nParam1, int nParam2)
        {
            return nParam1 - nParam2;
        }
    };
    
    //抽象工厂
    class IFactory
    {
    public:
        //定义了一个创建一个对象的接口
        virtual operation* CreateOperation() = 0;
    };
    
    ///具体工厂方法
    class AddFactory : public IFactory
    {
    public:
        operation* CreateOperation()
        {
            return new operationAdd;
        }
    };
    
    //减法工厂
    class SubFactory : public IFactory
    {
    public:
        operation* CreateOperation()
        {
            return new operationSub;
        }
    };
    
    int main()
    {
        IFactory* pFactory = new AddFactory;
        operation* pOp = pFactory->CreateOperation();
        int sum = pOp->GetResult(1, 2);
        return 0;
    }
    #endif
    
    
    /*
    抽象工厂方法有多个抽象产品类,而工厂方法只有一个抽象产品类
    对于工厂方法工厂只能创建一类产品,而抽象工厂能创建多种产品
    */
    #include <iostream>
    struct User{};
    class IUser
    {
    public:
        virtual void Insert(User* user) = 0;
        virtual User* GetUser(int nId) = 0;
    };
    
    class SqlserverUser : public IUser
    {
    public:
        void Insert(User* user)
        {
            std::cout << "SqlServer中User插入记录" << std::endl;
        }
        User* GetUser(int nId)
        {
            std::cout << "SqlServer中查询一条记录" << std::endl;
            return nullptr;
        }
    };
    
    class AcessUser : public IUser
    {
    public:
        void Insert(User* user)
        {
            std::cout << "Acess中User插入记录" << std::endl;
        }
        User* GetUser(int nId)
        {
            std::cout << "Acess中查询一条记录" << std::endl;
            return nullptr;
    
        }
    };
    
    struct Department{};
    class IDepartment
    {
    public:
        virtual void Insert(Department user) = 0;
        virtual Department* GetUser(int nId) = 0;
    };
    
    
    
    class SqlserverDepartment : public IDepartment
    {
    public:
        void Insert(Department user)
        {
            std::cout << "SqlServer中Department插入记录" << std::endl;
        }
        Department* GetUser(int nId)
        {
            std::cout << "SqlServer中查询一条记录" << std::endl;
            return nullptr;
        }
    };
    
    class AcessDepartment : public IDepartment
    {
    public:
        void Insert(Department user)
        {
            std::cout << "Acess中Department插入记录" << std::endl;
        }
        Department* GetUser(int nId)
        {
            std::cout << "Acess中查询一条记录" << std::endl;
            return nullptr;
    
        }
    };
    
    
    //抽象工厂能创建多种产品
    class IFactory
    {
    public:
        virtual IUser* CreateUser() = 0;
        virtual IDepartment* CreateDepart() = 0;
    };
    
    class SqlServerFactory : public IFactory
    {
    public:
        IUser* CreateUser()
        {
            return new SqlserverUser;
        }
    
        IDepartment* CreateDepart()
        {
            return new SqlserverDepartment;
        }
    };
    
    class AcessFactory : public IFactory
    {
    public:
        IUser* CreateUser()
        {
            return new AcessUser;
        }
        IDepartment* CreateDepart()
        {
            return new AcessDepartment;
        }
    };
    
    int main()
    {
        User* user = new User;
        IFactory* pFact = new SqlServerFactory;
        IUser* pUser = pFact->CreateUser();
    
        pUser->GetUser(1);
        pUser->Insert(user);
        getchar();
    }
  • 相关阅读:
    并行执行计划
    mongodb数据查询-小结
    mongodb的基本操作-小结
    架构
    bat、dos控制多个后台程序启动
    python技术实践清单
    Linux升级安装python2.7.5到python2.7.9
    数据分析-GDP统计
    技术能力清单-小结
    动态链接库*.so
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4354131.html
Copyright © 2011-2022 走看看