首页 > 代码库 > 【设计模式】——抽象工厂模式
【设计模式】——抽象工厂模式
抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
AbstractProductA和AbstractProductB是两个抽象产品,之所以抽象,是因为他们都有可能有两种不同的实现,而ProductA1、ProductA2和ProductB1、ProductB2就是对两个抽象产品的具体分类的实现。AbstractFactory是一个抽象工厂接口,它里面应该包含所有的产品创建的抽象方法,而ConcreteFactroy1和ConcreteFactory2就是具体工厂了。通常是在运行时刻在创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端使用不同的具体工厂。
来看个例子吧,代码结构图如下所示:
#include <iostream>using namespace std;//用户类class User{private: int _id; string _name;private: void SetId(int id) { this->_id=id; } int GetId() { return this->_id; } void SetName(string name) { this->_name=name; } string GetName() { return this->_name; }};//IUser接口,用于客户端访问,解除与具体数据访问的耦合class IUser{public: virtual void Insert(){} virtual void GetUser(){}};//SqlserverUser类,用于访问SQL Server的Userclass SqlserverUser:public IUser{public: void Insert() { cout << "在SQL Server中给user表增加一条记录" << endl; } void GetUser() { cout << "在SQL Server中根据ID得到User表一条记录" << endl; }};//AccessUser类,用于访问Access的Userclass AccessUser:public IUser{public: void Insert() { cout << "在SQL Server中给user表增加一条记录" << endl; } void GetUser() { cout << "在SQL Server中根据ID得到User表一条记录" << endl; }};//部门类class Department{private: int _id; string _deptname;private: void SetId(int id) { this->_id=id; } int GetId() { return this->_id; } void SetDeptname(string name) { this->_deptname=name; } string GetName() { return this->_deptname; }};//IDpedartment接口,用于客户端访问,解除与具体数据访问的耦合class IDepartment{public: virtual void Insert(){} virtual void GetUser(){}};//SqlserverDepartment类,用于访问SQL Server的Departmentclass SqlserverDepartment:public IDepartment{public: void Insert() { cout << "在SQL Server中给Department表增加一条记录" << endl; } void GetUser() { cout << "在SQL Server中根据ID得到Department表一条记录" << endl; }};//AccessDepartment类,用于访问Access的Departmentclass AccessDepartment:public IDepartment{public: void Insert() { cout << "在Access中给Department表增加一条记录" << endl; } void GetUser() { cout << "在Access中根据ID得到Department表一条记录" << endl; }};//IFactory接口,定义一个创建访问Department表对象的抽象的工厂接口class IFactory{public: virtual IUser *CreateUser()=0; virtual IDepartment *CreateDepartment()=0;};//SqlServerFactory类,实现IFactory接口,实例化SqlserverUser和SqlserverDepartmentclass SqlServerFactory:public IFactory{public: IUser *CreateUser() { return new SqlserverUser(); } IDepartment *CreateDepartment() { return new SqlserverDepartment(); }};//AccessFactory类,实现IFactory接口,实现AccessUser和AccessDepartmentclass AccessFactory:public IFactory{public: IUser *CreateUser() { return new AccessUser(); } IDepartment *CreateDepartment() { return new AccessDepartment(); }};int main(){ User *user=new User(); Department *dept=new Department(); IFactory *factory=new AccessFactory(); IUser *iu=factory->CreateUser(); iu->Insert(); iu->GetUser(); IDepartment *id=factory->CreateDepartment(); id->Insert(); id->GetUser(); return 0;}
抽象工厂模式好处是易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置;同时,它让具体的创建实例过程与客户端分离,客户端通过他们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。