1.抽象工厂模式简介
抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体实现的类。UML类图如下:
抽象工厂类对应有多个系列的产品,每个系列都有一个抽象产品父类和多个具体产品子类。定义了一个父类工厂,并且对每一个系列产品都有对个具体的子类工厂,子类工厂中定义了该系列产品的具体创建方法。
2.实例
定义了两类数据库的操作类,包括sql和access。UML类图如下所示
c++代码实现如下
#include<exception>
#include <iostream>
#include<string>
using namespace std;
//7、抽象工厂模式:数据库类
class User
{
public:
User(string istrName, string iId):m_strName(istrName),m_id(iId){}
string getName(){ return m_strName; }
string getID(){ return m_id; }
private:
string m_strName;
string m_id;
};
class Department
{
public:
Department(string istrName, string iId) :m_strName(istrName), m_id(iId){}
string getName(){ return m_strName; }
string getID(){ return m_id; }
private:
string m_strName;
string m_id;
};
class DataUser
{
public:
virtual ~DataUser(){};
virtual void addUser(User *ipUser) = 0;
virtual void delUser(User *ipUser) = 0;
};
class SqlServerUser:public DataUser
{
public:
void addUser(User *ipUser) override
{
cout << "add sql user "<<ipUser->getName()<<":" <<ipUser->getID()<< endl;
}
void delUser(User *ipUser) override
{
cout << "del sql user " << ipUser->getName() << ":" << ipUser->getID() << endl;
}
};
class AccessUser :public DataUser
{
public:
void addUser(User *ipUser) override
{
cout << "add access user " << ipUser->getName() << ":" << ipUser->getID() << endl;
}
void delUser(User *ipUser) override
{
cout << "del access user " << ipUser->getName() << ":" << ipUser->getID() << endl;
}
};
class AccessUser :public DataUser
{
public:
void addUser(User *ipUser) override
{
cout << "add access user " << ipUser->getName() << ":" << ipUser->getID() << endl;
}
void delUser(User *ipUser) override
{
cout << "del access user " << ipUser->getName() << ":" << ipUser->getID() << endl;
}
};
class DataDepartment
{
public:
virtual ~DataDepartment(){};
virtual void addDepartment(Department *ipDepartment) = 0;
virtual void delDepartment(Department *ipDepartment) = 0;
};
class SqlServerDepartment :public DataDepartment
{
public:
void addDepartment(Department *ipDepartment) override
{
cout << "add sql department " << ipDepartment->getName() << ":" << ipDepartment->getID() << endl;
}
void delDepartment(Department *ipDepartment) override
{
cout << "del sql department " << ipDepartment->getName() << ":" << ipDepartment->getID() << endl;
}
};
class AccessDepartment :public DataDepartment
{
public:
void addDepartment(Department *ipDepartment) override
{
cout << "add access department " << ipDepartment->getName() << ":" << ipDepartment->getID() << endl;
}
void delDepartment(Department *ipDepartment) override
{
cout << "del access department " << ipDepartment->getName() << ":" << ipDepartment->getID() << endl;
}
};
class DataFactory
{
public:
virtual ~DataFactory(){};
virtual DataUser *createUser() = 0;
virtual DataDepartment *createDepartment() = 0;
};
class SqlServerFactory :public DataFactory
{
public:
DataUser *createUser()
{
return new SqlServerUser;
}
DataDepartment *createDepartment()
{
return new SqlServerDepartment;
}
};
class AccessFactory :public DataFactory
{
public:
DataUser *createUser()
{
return new AccessUser;
}
DataDepartment *createDepartment()
{
return new AccessDepartment;
}
};
int main()
{
User *pUser = new User("wyl","1234");
Department *pDepartment = new Department("hust","4567");
SqlServerFactory *pFact = new SqlServerFactory;
DataUser *pServerUser = pFact->createUser();
pServerUser->addUser(pUser);
DataDepartment *pDataDepartment = pFact->createDepartment();
pDataDepartment->addDepartment(pDepartment);
delete pDataDepartment;
delete pServerUser;
delete pFact;
delete pDepartment;
delete pUser;
system("pause");
}