应用场景:
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
2、系统中有多于一个的产品族,而每次只使用其中某一产品族。
3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
优点:
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
简单实现:
#include <string>
#include <iostream>
#include <vector>
using namespace std;
//用户抽象接口
class IUser
{
public:
virtualvoid GetUser()=0;
virtualvoid InsertUser()=0;
};
//部门抽象接口
class IDepartment
{
public:
virtualvoid GetDepartment()=0;
virtualvoid InsertDepartment()=0;
};
//ACCESS 用户
class CAccessUser : public IUser
{
public:
virtualvoid GetUser()
{
cout<<"AccessGetUser"<<endl;
}
virtualvoid InsertUser()
{
cout<<"AccessInsertUser"<<endl;
}
};
//ACCESS 部门
class CAccessDepartment : public IDepartment
{
public:
virtualvoid GetDepartment()
{
cout<<"AccessGetDepartment"<<endl;
}
virtualvoid InsertDepartment()
{
cout<<"AccessInsertDepartment"<<endl;
}
};
//SQL 用户
class CSqlUser : public IUser
{
public:
virtualvoid GetUser()
{
cout<<"SqlUser"<<endl;
}
virtualvoid InsertUser()
{
cout<<"SqlUser"<<endl;
}
};
//SQL 部门类
class CSqlDepartment: public IDepartment
{
public:
virtualvoid GetDepartment()
{
cout<<"sqlgetDepartment"<<endl;
}
virtualvoid InsertDepartment()
{
cout<<"sqlinsertdepartment"<<endl;
}
};
//抽象工厂
class IFactory
{
public:
virtualIUser* CreateUser()=0;
virtualIDepartment* CreateDepartment()=0;
};
//ACCESS 工厂
class AccessFactory : public IFactory
{
public:
virtualIUser* CreateUser()
{
returnnew CAccessUser();
}
virtualIDepartment* CreateDepartment()
{
returnnew CAccessDepartment();
}
};
//SQL 工厂
class SqlFactory : public IFactory
{
public:
virtualIUser* CreateUser()
{
returnnew CSqlUser();
}
virtualIDepartment* CreateDepartment()
{
returnnew CSqlDepartment();
}
};
客户端:
int main()
{
IFactory*factory= new SqlFactory();
IUser*user=factory->CreateUser();
IDepartment*depart = factory->CreateDepartment();
User->GetUser();
depart->GetDepartment();
return0;
}