Riordon

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

 引言:工作中常会遇到这种情况,我们用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)具体实例创建过程与客户分离,端通过抽象接口操纵实例产品的具体类名具体工厂实现分离,不会出现在客户代码中

 

 

 

 

posted on 2013-04-16 09:30  Riordon  阅读(113)  评论(0)    收藏  举报