引言:工作中常会遇到这种情况,我们用Sqlserver 操作各种表,某天,老板跑来,嘿嘿的说:用户改用Access了,我们得满足用户的需要,员工们顿时陷入沉思中...
AbstractFactory模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.
接口实现
(1)User接口
View Code
1 // IUser.h: interface for the CIUser class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_IUSER_H__54D9722B_8743_4E1B_9584_9E23012B9518__INCLUDED_) 6 #define AFX_IUSER_H__54D9722B_8743_4E1B_9584_9E23012B9518__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 class CIUser 13 { 14 public: 15 CIUser(); 16 virtual ~CIUser(); 17 18 virtual void Insert() = 0; 19 virtual void GetUser() = 0; 20 21 }; 22 23 #endif // !defined(AFX_IUSER_H__54D9722B_8743_4E1B_9584_9E23012B9518__INCLUDED_)
View Code
1 // IUser.cpp: implementation of the CIUser class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "IUser.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 12 CIUser::CIUser() 13 { 14 15 } 16 17 CIUser::~CIUser() 18 { 19 20 }
(2)Department接口
View Code
1 // IDepartment.h: interface for the CIDepartment class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_IDEPARTMENT_H__C8CBEC47_0082_4F7A_B547_CAA25FA84063__INCLUDED_) 6 #define AFX_IDEPARTMENT_H__C8CBEC47_0082_4F7A_B547_CAA25FA84063__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 class CIDepartment 13 { 14 public: 15 CIDepartment(); 16 virtual ~CIDepartment(); 17 18 virtual void Insert() = 0; 19 virtual void GetDepartment() = 0; 20 }; 21 22 #endif // !defined(AFX_IDEPARTMENT_H__C8CBEC47_0082_4F7A_B547_CAA25FA84063__INCLUDED_)
View Code
1 // IDepartment.cpp: implementation of the CIDepartment class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "IDepartment.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 12 CIDepartment::CIDepartment() 13 { 14 15 } 16 17 CIDepartment::~CIDepartment() 18 { 19 20 }
(3)Factory接口
View Code
1 // IFactory.h: interface for the CIFactory class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_IFACTORY_H__FF148A66_E5C7_4426_8DD2_65228FBB8175__INCLUDED_) 6 #define AFX_IFACTORY_H__FF148A66_E5C7_4426_8DD2_65228FBB8175__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 #include "IUser.h" 12 #include "IFactory.h" 13 #include "IDepartment.h" 14 15 class CIFactory 16 { 17 public: 18 CIFactory(); 19 virtual ~CIFactory(); 20 21 virtual CIUser* CreateUser() = 0; 22 virtual CIDepartment* CreateDepartment() = 0; 23 }; 24 25 #endif // !defined(AFX_IFACTORY_H__FF148A66_E5C7_4426_8DD2_65228FBB8175__INCLUDED_)
View Code
1 // IFactory.cpp: implementation of the CIFactory class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "IFactory.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 12 CIFactory::CIFactory() 13 { 14 15 } 16 17 CIFactory::~CIFactory() 18 { 19 20 }
由接口类派生的可实例化类实现
(1)SqlserverUser
View Code
1 // SqlserverUser.h: interface for the CSqlserverUser class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_SQLSERVERUSER_H__45310C7D_DF16_4348_960E_26D2B4B43AEB__INCLUDED_) 6 #define AFX_SQLSERVERUSER_H__45310C7D_DF16_4348_960E_26D2B4B43AEB__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 #include "IUser.h" 13 14 class CSqlserverUser : public CIUser 15 { 16 public: 17 CSqlserverUser(); 18 virtual ~CSqlserverUser(); 19 20 virtual void Insert(); 21 virtual void GetUser(); 22 23 }; 24 25 #endif // !defined(AFX_SQLSERVERUSER_H__45310C7D_DF16_4348_960E_26D2B4B43AEB__INCLUDED_)
View Code
1 // SqlserverUser.cpp: implementation of the CSqlserverUser class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "SqlserverUser.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 12 CSqlserverUser::CSqlserverUser() 13 { 14 15 } 16 17 CSqlserverUser::~CSqlserverUser() 18 { 19 20 } 21 22 void CSqlserverUser::Insert() 23 { 24 cout<<"在SQL Server中给User表增加一条记录"<<endl; 25 } 26 27 void CSqlserverUser::GetUser() 28 { 29 cout<<"在SQL Server中给User表获取一条记录"<<endl; 30 }
(2)SqlserverDepartment
View Code
1 // AccessUser.h: interface for the CAccessUser class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_ACCESSUSER_H__F70BBEA1_4507_4F9B_8DFC_8EA6720F87E9__INCLUDED_) 6 #define AFX_ACCESSUSER_H__F70BBEA1_4507_4F9B_8DFC_8EA6720F87E9__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 #include "IUser.h" 13 14 class CAccessUser : public CIUser 15 { 16 public: 17 CAccessUser(); 18 virtual ~CAccessUser(); 19 20 virtual void Insert(); 21 virtual void GetUser(); 22 }; 23 24 #endif // !defined(AFX_ACCESSUSER_H__F70BBEA1_4507_4F9B_8DFC_8EA6720F87E9__INCLUDED_)
View Code
1 // AccessUser.cpp: implementation of the CAccessUser class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "AccessUser.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 12 CAccessUser::CAccessUser() 13 { 14 15 } 16 17 CAccessUser::~CAccessUser() 18 { 19 20 } 21 22 void CAccessUser::Insert() 23 { 24 cout<<"在Access中给User表增加一条记录"<<endl; 25 } 26 27 void CAccessUser::GetUser() 28 { 29 cout<<"在Access中给User表获取一条记录"<<endl; 30 }
(3)AccessUser
View Code
1 // SqlserverDepartment.h: interface for the CSqlserverDepartment class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_SQLSERVERDEPARTMENT_H__2BB41065_C5F9_4A34_A0C7_F325C74BE588__INCLUDED_) 6 #define AFX_SQLSERVERDEPARTMENT_H__2BB41065_C5F9_4A34_A0C7_F325C74BE588__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 #include "IDepartment.h" 13 14 class CSqlserverDepartment : public CIDepartment 15 { 16 public: 17 CSqlserverDepartment(); 18 virtual ~CSqlserverDepartment(); 19 20 virtual void Insert(); 21 virtual void GetDepartment(); 22 }; 23 24 #endif // !defined(AFX_SQLSERVERDEPARTMENT_H__2BB41065_C5F9_4A34_A0C7_F325C74BE588__INCLUDED_)
View Code
1 // SqlserverDepartment.cpp: implementation of the CSqlserverDepartment class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "SqlserverDepartment.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 12 CSqlserverDepartment::CSqlserverDepartment() 13 { 14 15 } 16 17 CSqlserverDepartment::~CSqlserverDepartment() 18 { 19 20 } 21 22 void CSqlserverDepartment::Insert() 23 { 24 cout<<"在SQL Server中给Department表增加一条记录"<<endl; 25 } 26 27 void CSqlserverDepartment::GetDepartment() 28 { 29 cout<<"在SQL Server中给Department表获取一条记录"<<endl; 30 }
(4)AccessDepartment
View Code
1 // AccessDepartment.h: interface for the CAccessDepartment class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_ACCESSDEPARTMENT_H__98B59957_BFD1_447A_AFF0_078181E9D19B__INCLUDED_) 6 #define AFX_ACCESSDEPARTMENT_H__98B59957_BFD1_447A_AFF0_078181E9D19B__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 #include "IDepartment.h" 13 14 class CAccessDepartment : public CIDepartment 15 { 16 public: 17 CAccessDepartment(); 18 virtual ~CAccessDepartment(); 19 20 virtual void Insert(); 21 virtual void GetDepartment(); 22 }; 23 24 #endif // !defined(AFX_ACCESSDEPARTMENT_H__98B59957_BFD1_447A_AFF0_078181E9D19B__INCLUDED_)
View Code
1 // AccessDepartment.cpp: implementation of the CAccessDepartment class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "AccessDepartment.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 12 CAccessDepartment::CAccessDepartment() 13 { 14 15 } 16 17 CAccessDepartment::~CAccessDepartment() 18 { 19 20 } 21 22 void CAccessDepartment::Insert() 23 { 24 cout<<"在Access中给Department表增加一条记录"<<endl; 25 } 26 27 void CAccessDepartment::GetDepartment() 28 { 29 cout<<"在Access中给Department表获取一条记录"<<endl; 30 }
(5)SqlserverFactory
View Code
1 // SqlserverFactory.h: interface for the CSqlserverFactory class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_SQLSERVERFACTORY_H__7FB65984_C009_4FF1_9D0D_9E64F743D5C9__INCLUDED_) 6 #define AFX_SQLSERVERFACTORY_H__7FB65984_C009_4FF1_9D0D_9E64F743D5C9__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 #include "IFactory.h" 13 14 class CSqlserverFactory : public CIFactory 15 { 16 public: 17 CSqlserverFactory(); 18 virtual ~CSqlserverFactory(); 19 20 virtual CIUser* CreateUser(); 21 virtual CIDepartment* CreateDepartment(); 22 }; 23 24 #endif // !defined(AFX_SQLSERVERFACTORY_H__7FB65984_C009_4FF1_9D0D_9E64F743D5C9__INCLUDED_)
View Code
1 // SqlserverFactory.cpp: implementation of the CSqlserverFactory class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "SqlserverFactory.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 #include "SqlserverUser.h" 12 #include "SqlserverDepartment.h" 13 14 CSqlserverFactory::CSqlserverFactory() 15 { 16 17 } 18 19 CSqlserverFactory::~CSqlserverFactory() 20 { 21 22 } 23 24 CIUser* CSqlserverFactory::CreateUser() 25 { 26 return new CSqlserverUser(); 27 } 28 29 CIDepartment* CSqlserverFactory::CreateDepartment() 30 { 31 return new CSqlserverDepartment(); 32 }
(6)AccessFactory
View Code
1 // AccessFactory.h: interface for the CAccessFactory class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #if !defined(AFX_ACCESSFACTORY_H__E4900863_93EE_46D4_8158_F8D0B89FDEFC__INCLUDED_) 6 #define AFX_ACCESSFACTORY_H__E4900863_93EE_46D4_8158_F8D0B89FDEFC__INCLUDED_ 7 8 #if _MSC_VER > 1000 9 #pragma once 10 #endif // _MSC_VER > 1000 11 12 #include "IFactory.h" 13 14 class CAccessFactory : public CIFactory 15 { 16 public: 17 CAccessFactory(); 18 virtual ~CAccessFactory(); 19 20 virtual CIUser* CreateUser(); 21 virtual CIDepartment* CreateDepartment(); 22 }; 23 24 #endif // !defined(AFX_ACCESSFACTORY_H__E4900863_93EE_46D4_8158_F8D0B89FDEFC__INCLUDED_)
View Code
1 // AccessFactory.cpp: implementation of the CAccessFactory class. 2 // 3 ////////////////////////////////////////////////////////////////////// 4 5 #include "stdafx.h" 6 #include "AccessFactory.h" 7 8 ////////////////////////////////////////////////////////////////////// 9 // Construction/Destruction 10 ////////////////////////////////////////////////////////////////////// 11 #include "AccessUser.h" 12 #include "AccessDepartment.h" 13 14 CAccessFactory::CAccessFactory() 15 { 16 17 } 18 19 CAccessFactory::~CAccessFactory() 20 { 21 22 } 23 24 CIUser* CAccessFactory::CreateUser() 25 { 26 return new CAccessUser(); 27 } 28 29 CIDepartment* CAccessFactory::CreateDepartment() 30 { 31 return new CAccessDepartment(); 32 }
客户端测试
View Code
1 // AbstractFactory.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "AccessDepartment.h" 6 #include "AccessFactory.h" 7 #include "AccessUser.h" 8 #include "SqlserverDepartment.h" 9 #include "SqlserverFactory.h" 10 #include "SqlserverUser.h" 11 12 int main(int argc, char* argv[]) 13 { 14 15 CIFactory * pFactory = NULL; 16 17 int choise; 18 cout<<"选择数据库: "; 19 cin>>choise; 20 switch(choise) 21 { 22 case 1: 23 pFactory= new CSqlserverFactory(); //创建SqlServer访问的工厂 24 break; 25 case 2: 26 pFactory = new CAccessFactory(); //创建Access访问的工厂 27 break; 28 } 29 30 //一致的操作 31 CIUser * pUser = NULL; 32 CIDepartment * pDepartment = NULL; 33 34 pUser = pFactory->CreateUser(); 35 pDepartment= pFactory->CreateDepartment(); 36 37 pUser->Insert(); 38 pUser->GetUser(); 39 pDepartment->Insert(); 40 pDepartment->GetDepartment(); 41 42 return 0; 43 }
优点:(1)易于交换产品系列,使得改变一个应用的具体工厂变得非常容易
(2)具体实例创建过程与客户分离,端通过抽象接口操纵实例产品的具体类名具体工厂实现分离,不会出现在客户代码中
我喜欢一无所有,这样就只能一步一步的创造世界...


浙公网安备 33010602011771号