抽象工厂模式
抽象工厂模式定义
抽象工厂模式(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
浙公网安备 33010602011771号