//简单工厂
/*
当新添加一个操作时,需要添加新的实现类和在工厂方法的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();
}