## 模式定義:
? ? ? 抽象工廠模式提供一個接口,用于創建相關或依賴對象的家族,而不需要明確指定具體類。
? ? ? 抽象工廠允許客戶使用抽象的接口來創建一組相關產品,而不需要知道實際產出的具體產品時什么。這樣一來,客戶就從具體的產品中被解耦了。
## 模式結構:

## 舉例:
? ? ? 數據庫訪問程序設計,不同的數據庫訪問方式可能不一樣,為了抽象對對不同數據庫的訪問,可以將數據庫隱藏起來,提供統一的訪問方式,用多態進行實現。
## UML設計:

## 編程實現及執行結果:
~~~
#include <iostream>
using namespace std;
~~~
? 用戶表接口
~~~
class IUser
{
public:
virtual void Insert() = 0;
virtual void GetUser() = 0;
};
~~~
? SqlServer數據庫訪問User表
~~~
class SqlServerUser : public IUser
{
public:
void Insert()
{
cout<<"在SQL Server中給User表增加一條記錄"<<endl;
}
void GetUser()
{
cout<<"在SQL Server中給User表獲取一條記錄"<<endl;
}
};
~~~
? Access數據庫訪問User表
~~~
class AccessUser : public IUser
{
public:
void Insert()
{
cout<<"在Access中給User表增加一條記錄"<<endl;
}
void GetUser()
{
cout<<"在Access中User表獲取一條記錄"<<endl;
}
};
~~~
? Department表接口
~~~
class IDepartment
{
public:
virtual void Insert() = 0;
virtual void GetDepartment() = 0;
};
~~~
? SqlServer數據庫訪問Department表
~~~
class SqlServerDepartment : public IDepartment
{
public:
void Insert()
{
cout<<"在SQL Server中給Department表增加一條記錄"<<endl;
}
void GetDepartment()
{
cout<<"在SQL Server中Department獲取一條記錄"<<endl;
};
};
~~~
? Access數據庫訪問Department表
~~~
class AccessDepartment : public IDepartment
{
public:
void Insert()
{
cout<<"在Access中給Department表增加一條記錄"<<endl;
}
void GetDepartment()
{
cout<<"在Access中Department獲取一條記錄"<<endl;
};
};
~~~
? 抽象工廠接口
~~~
class IFactory
{
public:
virtual IUser* CreateUser() = 0;
virtual IDepartment* CreateDepartment() = 0;
};
~~~
? SqlServer工廠實現
~~~
class SqlServerFactory : public IFactory
{
IUser* CreateUser()
{
return new SqlServerUser();
}
IDepartment* CreateDepartment()
{
return new SqlServerDepartment();
}
};
~~~
? Access工廠實現
~~~
class AccessFactory : public IFactory
{
IUser* CreateUser()
{
return new AccessUser();
}
IDepartment* CreateDepartment()
{
return new AccessDepartment();
}
};
~~~
? 客戶代碼
~~~
int main()
{
//創建工廠
IFactory * pFactory = NULL;
IUser * pUser = NULL;
IDepartment * pDepartment = NULL;
int choise;
cout<<"選擇數據庫: ";
cin>>choise;
switch(choise)
{
case 1:
pFactory= new SqlServerFactory(); //創建SqlServer訪問的工廠
break;
case 2:
pFactory = new AccessFactory(); //創建Access訪問的工廠
break;
}
//一致的操作
pUser = pFactory->CreateUser();
pDepartment= pFactory->CreateDepartment();
pUser->Insert();
pUser->GetUser();
pDepartment->Insert();
pDepartment->GetDepartment();
return 0;
}
~~~
執行結果如下:
**選擇數據庫: 2**
**在Access中給User表增加一條記錄**
**在Access中User表獲取一條記錄**
**在Access中給Department表增加一條記錄**
**在Access中Department獲取一條記錄**
**請按任意鍵繼續. . .**
## 設計原則的應用:
? ? ? 設計原則4:為交互對象之間的耦合設計而努力
參考:[http://baike.baidu.com/view/1580269.htm?fr=aladdin](http://baike.baidu.com/view/1580269.htm?fr=aladdin)
??????? ? Head First 設計模式