首页 > 代码库 > 【设计模式】——抽象工厂模式

【设计模式】——抽象工厂模式

抽象工厂模式(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;}

  抽象工厂模式好处是易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置;同时,它让具体的创建实例过程与客户端分离,客户端通过他们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。