抽象工厂例子

//简单工厂
/*
当新添加一个操作时,需要添加新的实现类和在工厂方法的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();
}
原文地址:https://www.cnblogs.com/zzyoucan/p/4354131.html