作者:U友50081205_653 | 来源:互联网 | 2023-09-10 14:31
1.定义抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工
1.定义
抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
2.UML类图
3.代码实现
#include
#include
using namespace std;class IUser
{
public:virtual void getUser() = 0;virtual void setUser() = 0;
};class SqlUser :public IUser
{
public:void getUser(){cout <<"在sql中返回user" <};class AccessUser :public IUser
{
public:void getUser(){cout <<"在Access中返回user" <};class IDepartment
{
public:virtual void getDepartment() = 0;virtual void setDepartment() = 0;
};class SqlDepartment :public IDepartment
{
public:void getDepartment(){cout <<"在sql中返回Department" <};class AccessDepartment :public IDepartment
{
public:void getDepartment(){cout <<"在Access中返回Department" <};class IFactory
{
public:virtual IUser *createUser() = 0;virtual IDepartment *createDepartment() = 0;
};class SqlFactory :public IFactory
{
public:IUser *createUser(){return new SqlUser();}IDepartment *createDepartment(){return new SqlDepartment();}
};class AccessFactory :public IFactory
{
public:IUser *createUser(){return new AccessUser();}IDepartment *createDepartment(){return new AccessDepartment();}
};/*************************************************************/class DataAccess
{
private:static string db;//string db="access";
public:static IUser *createUser(){if (db == "access"){return new AccessUser();}else if (db == "sql"){return new SqlUser();}}static IDepartment *createDepartment(){if (db == "access"){return new AccessDepartment();}else if (db == "sql"){return new SqlDepartment();}}
};
string DataAccess::db = "sql";/*************************************************************/int main()
{//IFactory *factory=new SqlFactory();IFactory *factory;IUser *user;IDepartment *department;factory = new AccessFactory();user = factory->createUser();department = factory->createDepartment();user->getUser();user->setUser();department->getDepartment();department->setDepartment();user = DataAccess::createUser();department = DataAccess::createDepartment();user->getUser();user->setUser();department->getDepartment();department->setDepartment();return 0;
}