抽象工厂
简介
抽象工厂模式,是设计模式中最简单的一种应用,其根据C++多态与继承的特点,工厂模式依据虚类提供必要的公共接口,具体实现类根据接口进行具体实现,而相关类则直接根据虚基类的接口进行相关程序调用。
意图
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类。
效果
抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中被解耦了。
效果
-
它分离了具体的类
-
它使得易于交换产品系列
-
有利于产品的一致性
-
难以支持新种类的产品
举例
数据库访问程序设计,不同的数据库访问方式可能不一样,为了抽象对不同数据库的访问,可以将数据库隐藏起来,提供统一的访问方式,用多态进行实现。
UML设计
编程实现
#include <iostream> using namespace std;
IUser ~用户表结构~
class IUser{ public: virtual void Insert() = 0; virtual void GetUser() = 0; }
SQL Server 数据库访问User表
class SQLServer:public IUser { public: void Insert(){ cout<<"SQL 给USer表插入一条记录"<<endl; } void GetUser(){ cout<<"在SQL 中获取一条记录"<<endl; }
Access 数据库访问User表
class AccessUser: public IUser { pubic: void Insert(){ cout << "Access 给User表插入一条记录"<<endl; } void GetUser(){ cout <<"Access 中获取一条记录"<<endl; } }
Department 表接口
class IDepartment { public: virtual void Insert() = 0; virtual void GetDepartment() = 0; }
抽象工厂接口
class IFactory { public: virtual IUser* CreateUser() = 0; virtual IDepartment* CreateDepartment() = 0; }
SQL Server 工厂实现
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() { /// 创建工厂 IFactory* pFactory = nullptr; IUser* pUser = nullptr; IDepartment* pDepartment = nullptr; int choise; cout<<"选择数据库"; cin>>choise; switch(choise){ case 1: pFactory = new SqlServerFactory(); break; case 2: pFactory = new AccessFactory(); break; } /// 一致性操作 pUser = pFactory->CreateUser(); pDepartment = pFactory->CreateDepartment(); pUser->Insert(); pUser->GetUser(); pDepartment->Insert(); pDepartment->GetDepartment(); return 0; }
other
-
为了解决抽象工厂不够灵活的缺点,一种更灵活但不太安全的设计是给创建对象的操作增加一个参数,该参数可以是一个类标示符、一个整数、以这个字符串,或其他任何可以标示这种产品的东西。