抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
AbstractProductA和AbstractProductB是两个抽象产品,它们有两种或多种不同的实现,而ProductA1、ProductA2和ProductB1、ProductB2就是对这两抽象产品的具体分类的实现。 在运行时刻再创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端使用不同的具体工厂。
优点:它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象抽象接口操纵实例,产品的具体类名也被具体具体工厂的实心分离,不会出现在客户代码中。
缺点是当增加功能时,要修改多出地方,具体工厂和抽象工厂都要修改。
#include <iostream>
#include <string>
using namespace std;
/*用户表类*/
class User
{
private:
int _id;
string _name;
public:
void SetId(int id)
{
_id = id;
}
int GetId()
{
return _id;
}
void SetName(string name)
{
_name = name;
}
string GetName()
{
return _name;
}
};
/*抽象用户表类*/
class IUser
{
public:
virtual void Insert(User user) = 0;
virtual void GetUser(int id) = 0;
};
/*SqlServer的用户表类*/
class SqlserverUser : public IUser
{
public:
void Insert(User user)
{
cout<<"在SQL Server 中给 User表增加一条记录"<<endl;
}
void GetUser(int id)
{
cout<<"在SQL Server 中根据ID得到User表一条记录"<<endl;
}
};
/*Access的用户表类*/
class AccessUser : public IUser
{
public:
void Insert(User user)
{
cout<<"在Access中给User表增加一条记录"<<endl;
}
void GetUser(int id)
{
cout<<"在 Access 中根据ID得到User表一条记录 "<<endl;
}
};
/*部门表类*/
class Department
{
private:
int _id;
string _deptName;
public:
void SetId(int id)
{
_id = id;
}
int GetId()
{
return _id;
}
void SetDeptName(string name)
{
_deptName = name;
}
string GetDeptName()
{
return _deptName;
}
};
class IDepartment
{
public:
virtual void Insert(Department department) = 0;
virtual void GetDepartment(int id) = 0;
};
class SqlserverDepartment : public IDepartment
{
public:
void Insert(Department department)
{
cout<<"在SQL Server中给Department表增加一条记录"<<endl;
}
void GetDepartment(int id)
{
cout<<"在SQL Server中根据ID得到Department表一条记录"<<endl;
}
};
class AccessDepartment : public IDepartment
{
public:
void Insert(Department department)
{
cout<<"在Access中给Department表增加一条记录"<<endl;
}
void GetDepartment(int id)
{
cout<<"在Access中根据ID得到Department表一条记录"<<endl;
}
};
/*抽象工厂类 接口*/
class IFactory
{
public:
virtual IUser* CreateUser() = 0;
virtual IDepartment* CreateDepartment() = 0;
};
/*SqlServer数据库的具体工厂类*/
class SqlServerFactory : public IFactory
{
public:
IUser* CreateUser()
{
return new SqlserverUser();
}
IDepartment* CreateDepartment()
{
return new SqlserverDepartment();
}
};
/*Access数据库的具体工厂类*/
class AccessFactory : public IFactory
{
public:
IUser* CreateUser()
{
return new AccessUser();
}
IDepartment* CreateDepartment()
{
return new AccessDepartment();
}
};
int main()
{
User user;
user.SetId(1);
user.SetName("张三");
Department dept;
dept.SetId(1);
dept.SetDeptName("技术部");
IFactory* factory;
SqlServerFactory sqlfactory;
factory = &sqlfactory;
IUser* iu = factory->CreateUser();
IDepartment* id = factory->CreateDepartment();
iu->Insert(user);
iu->GetUser(1);
id->Insert(dept);
id->GetDepartment(1);
delete iu;
delete id;
return 0;
}