抽象工厂模式

抽象工厂模式定义

抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

抽象工厂模式结构图

抽象工厂模式结构图如下所示:

01 抽象工厂模式结构图

抽象工厂模式的特点

① 最大的好处便是易于交换产品系列,由于具体工厂类,例如IFactory factory = new AccessFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。

② 抽象工厂模式让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离不会出现在客户代码中。

③ 缺点:增加项目表Project需要改动很多的地方,如:IProject、SQlserverProject、AccessProject。

抽象工厂模式实例应用

抽象工厂模式实例应用类图

02 抽象工厂模式实例应用类图

抽象工厂模式实例应用代码

  1 #include "iostream"
  2 using namespace std;
  3 #include <string>
  4 
  5 class IUser
  6 {
  7 public:
  8     virtual void Select(string sql) = 0;
  9     virtual void Insert(string sql) = 0;
 10 };
 11 
 12 class CSqlServerUser : public IUser
 13 {
 14 public:
 15     virtual void Select(string sql)
 16     {
 17         cout << "Sql Server用户表查询" << sql << endl;
 18     }
 19 
 20     virtual void Insert(string sql)
 21     {
 22         cout << "Sql Server用户表插入数据成功" << sql << endl;
 23     }
 24 };
 25 
 26 class CAccessUser : public IUser
 27 {
 28 public:
 29     virtual void Select(string sql)
 30     {
 31         cout << "Access 用户表查询数据库" << sql << endl;
 32     }
 33 
 34     virtual void Insert(string sql)
 35     {
 36         cout << "Access 用户表插入数据成功" << sql << endl;
 37     }
 38 };
 39 
 40 class IDepartment
 41 {
 42 public:
 43     virtual void Select(string sql) = 0;
 44     virtual void Insert(string sql) = 0;
 45 };
 46 
 47 class CSqlServerDepartment : public IDepartment
 48 {
 49 public:
 50     virtual void Select(string sql)
 51     {
 52         cout << "Sql Server部门表查询" << sql << endl;
 53     }
 54 
 55     virtual void Insert(string sql)
 56     {
 57         cout << "Sql Server部门表插入数据成功" << sql << endl;
 58     }
 59 };
 60 
 61 class CAccessDepartment : public IDepartment
 62 {
 63 public:
 64     virtual void Select(string sql)
 65     {
 66         cout << "Access 部门表查询数据库" << sql << endl;
 67     }
 68 
 69     virtual void Insert(string sql)
 70     {
 71         cout << "Access 部门表插入数据成功" << sql << endl;
 72     }
 73 };
 74 
 75 class IFactory
 76 {
 77 public:
 78     virtual IUser* CreateUser() = 0;
 79     virtual IDepartment* CreateDepartment() = 0;
 80 };
 81 
 82 class CSqlServerFactory : public IFactory
 83 {
 84 public:
 85     virtual IUser* CreateUser()
 86     {
 87         return new CSqlServerUser();
 88     }
 89     virtual IDepartment* CreateDepartment()
 90     {
 91         return new CSqlServerDepartment();
 92     }
 93 };
 94 
 95 class CAccessFactory : public IFactory
 96 {
 97 public:
 98     virtual IUser* CreateUser()
 99     {
100         return new CAccessUser();
101     }
102     virtual IDepartment* CreateDepartment()
103     {
104         return new CAccessDepartment();
105     }
106 };
107 
108 void main()
109 {
110     /*
111     // 连接Access数据库
112     IFactory* factory = new CAccessFactory();
113     */
114     // 连接Sql Server数据库
115     IFactory* factory = new CSqlServerFactory();
116     IUser* user = factory->CreateUser();
117     user->Insert("1+2");
118     user->Select("A+B");
119     IDepartment* department = factory->CreateDepartment();
120     department->Insert("12+21");
121     department->Select("z+y");
122 
123     if(factory != NULL)
124     {
125         delete factory;
126         factory = NULL;
127     }
128 
129     if(user != NULL)
130     {
131         delete user;
132         user = NULL;
133     }
134 
135     if(department != NULL)
136     {
137         delete department;
138         department = NULL;
139     }
140 }

简单工厂模式与抽象工厂模式结合实例应用

简单工厂模式与抽象工厂模式结合实例应用类图

03 简单工厂模式与抽象工厂模式结合实例应用类图 

简单工厂模式与抽象工厂模式结合实例应用代码

  1 #include "iostream"
  2 using namespace std;
  3 #include <string>
  4 
  5 class IUser
  6 {
  7 public:
  8     virtual void Select(string sql) = 0;
  9     virtual void Insert(string sql) = 0;
 10 };
 11 
 12 class CSqlServerUser : public IUser
 13 {
 14 public:
 15     virtual void Select(string sql)
 16     {
 17         cout << "Sql Server用户表查询" << sql << endl;
 18     }
 19 
 20     virtual void Insert(string sql)
 21     {
 22         cout << "Sql Server用户表插入数据成功" << sql << endl;
 23     }
 24 };
 25 
 26 class CAccessUser : public IUser
 27 {
 28 public:
 29     virtual void Select(string sql)
 30     {
 31         cout << "Access 用户表查询数据库" << sql << endl;
 32     }
 33 
 34     virtual void Insert(string sql)
 35     {
 36         cout << "Access 用户表插入数据成功" << sql << endl;
 37     }
 38 };
 39 
 40 class IDepartment
 41 {
 42 public:
 43     virtual void Select(string sql) = 0;
 44     virtual void Insert(string sql) = 0;
 45 };
 46 
 47 class CSqlServerDepartment : public IDepartment
 48 {
 49 public:
 50     virtual void Select(string sql)
 51     {
 52         cout << "Sql Server部门表查询" << sql << endl;
 53     }
 54 
 55     virtual void Insert(string sql)
 56     {
 57         cout << "Sql Server部门表插入数据成功" << sql << endl;
 58     }
 59 };
 60 
 61 class CAccessDepartment : public IDepartment
 62 {
 63 public:
 64     virtual void Select(string sql)
 65     {
 66         cout << "Access 部门表查询数据库" << sql << endl;
 67     }
 68 
 69     virtual void Insert(string sql)
 70     {
 71         cout << "Access 部门表插入数据成功" << sql << endl;
 72     }
 73 };
 74 
 75 class IFactory
 76 {
 77 public:
 78     virtual IUser* CreateUser() = 0;
 79     virtual IDepartment* CreateDepartment() = 0;
 80 };
 81 
 82 class CDateAccess : public IFactory
 83 {
 84 private:
 85     char db;
 86 public:
 87     CDateAccess(char db)
 88     {
 89         this->db = db;
 90     }
 91     virtual IUser* CreateUser()
 92     {
 93         IUser* result = NULL;
 94         switch(db)
 95         {
 96         case 'S':
 97             result = new CSqlServerUser();
 98             break;
 99         case 'A':
100             result = new CAccessUser();
101             break;
102         default:
103             break;
104         }
105         return result;
106     }
107 
108     virtual IDepartment* CreateDepartment()
109     {
110         IDepartment* result = NULL;
111         switch(db)
112         {
113         case 'S':
114             result = new CSqlServerDepartment();
115             break;
116         case 'A':
117             result = new CAccessDepartment();
118             break;
119         default:
120             break;
121         }
122         return result;
123     }
124 };
125 
126 void main()
127 {
128     /*
129     // 连接Access数据库
130         IFactory* factory = new CDateAccess('S');
131     */
132     // 连接Sql Server数据库
133     IFactory* factory = new CDateAccess('A');
134     IUser* user = factory->CreateUser();
135     user->Insert("1+2");
136     user->Select("A+B");
137     IDepartment* department = factory->CreateDepartment();
138     department->Insert("12+21");
139     department->Select("z+y");
140 
141     if(factory != NULL)
142     {
143         delete factory;
144         factory = NULL;
145     }
146 
147     if(user != NULL)
148     {
149         delete user;
150         user = NULL;
151     }
152 
153     if(department != NULL)
154     {
155         delete department;
156         department = NULL;
157     }
158 }

2014-11-30   20:58:28

posted on 2014-11-30 20:54  xiaoheike  阅读(358)  评论(0)    收藏  举报

导航