设计模式C++实现十一:抽象工厂模式
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。
优点:便于交换产品系统,由于具体工厂类,在一个应用中只需要初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可以使用不同的产品配置。它让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类名也被具体工厂实现分离,不会出现在客户端代码中。
#ifndef ABSTRACTFACTORY_H #define ABSTRACTFACTORY_H #include<iostream> #include<string> using namespace std; class IDepartment { int id; string depname; public: virtual void Insert(IDepartment * dp)=0; virtual IDepartment * GetDepartment(int id)=0; }; class SqlserverDepartment :public IDepartment { public: void Insert(IDepartment * dp) ; IDepartment * GetDepartment(int id) ; }; void SqlserverDepartment::Insert(IDepartment * dp) { cout << "在SQL Server 中给Department表增加一条记录。\n"; } IDepartment * SqlserverDepartment::GetDepartment(int id) { cout << "在SQL Server 中根据ID得到Department表的一条记录。\n"; return NULL; } class AccessDepartment :public IDepartment { public: void Insert(IDepartment * dp); IDepartment * GetDepartment(int id); }; void AccessDepartment::Insert(IDepartment * dp) { cout << "在Access 中给Department表增加一条记录。\n"; } IDepartment * AccessDepartment::GetDepartment(int id) { cout << "在Access 中根据ID得到Department表的一条记录。\n"; return NULL; } class IUser { public: virtual void Insert(IUser *) = 0; virtual IUser * GetUser(int id) = 0; }; class SqlserverUser :public IUser { public: void Insert(IUser *); IUser * GetUser(int id); }; void SqlserverUser::Insert(IUser * in) { cout << "在SQL Server中给User表增加一条记录。\n"; } IUser * SqlserverUser::GetUser(int id) { cout << "在SQL Server 中根据ID得到User表中的一条记录。\n"; return NULL; } class AccessUser :public IUser { public: void Insert(IUser *); IUser * GetUser(int id); }; void AccessUser::Insert(IUser * in) { cout << "在Access给User表增加一条记录。\n"; } IUser * AccessUser::GetUser(int id) { cout << "在Access中根据ID得到User表中的一条记录。\n"; return NULL; } class IFactory { public: virtual IUser * CreateUser() = 0; virtual IDepartment * CreateDepartment() = 0; }; class SqlserverFactory :public IFactory { public: IUser * CreateUser(); IDepartment * CreateDepartment(); }; IUser * SqlserverFactory::CreateUser() { return new SqlserverUser; } IDepartment * SqlserverFactory::CreateDepartment() { return new SqlserverDepartment; } class AccessFactory :public IFactory { public: IUser * CreateUser(); IDepartment * CreateDepartment(); }; IUser * AccessFactory::CreateUser() { return new AccessUser; } IDepartment * AccessFactory::CreateDepartment() { return new AccessDepartment; } #endif
#include"AbstractFactory.h" int main() { IUser * userI = new SqlserverUser; IDepartment * dptI = new SqlserverDepartment; IFactory * factory = new SqlserverFactory; IUser * user = factory->CreateUser(); //IDepartment * dpt = factory->CreateDepartment(); user->Insert(userI); user->GetUser(1); IDepartment * dpt = factory->CreateDepartment(); dpt->Insert(dptI); dpt->GetDepartment(1); IDepartment * AdptI = new AccessDepartment; IFactory * Afactory = new AccessFactory; IDepartment * IDf=Afactory->CreateDepartment(); IDf->Insert(AdptI); IDf->GetDepartment(1); IUser *AuserI = new AccessUser; IUser * AUf = Afactory->CreateUser(); AUf->Insert(AuserI); AUf->GetUser(1); return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。