Abstract Factory
動機
- 經常面臨着“一系列相互依賴的對象工作”;同時,由於需求的變化,往往存在更多系列對象的創建工作。
- 如何應對這種變化?如何繞過常規的對象創建方法(new),提供一種“封裝機制”來避免客戶程序和這種“多系列具體對象創建工作”的緊耦合。
模式定義
提供一個接口,讓該接口負責創建一系列”相關或者相互依賴的對象“,無需指定它們具體的類。 ——《設計模式》GoF
要點總結
- 如果沒有應對”多系列對象創建“的需求變化,則沒有必要使用Abstract Factory模式,這時候使用簡單的工廠即可。
- ”系列對象“指的是在某一個特定系列的對象之間有相互依賴、或作用的關係(產品族)。不同系列的對象之間不能相互依賴。
- Abstract Factory模式主要在於應用”新系列“的需求變動。其缺點在與難以應對”新對象“的需求變動。
Demo
EmployeeDAO3.cpp:
//數據庫訪問有關的基類
class IDBConnection{
};
class IDBCommand{
};
class IDataReader{
};
class IDBFactory{
public:
virtual IDBConnection* CreateDBConnection()=0;
virtual IDBCommand* CreateDBCommand()=0;
virtual IDataReader* CreateDataReader()=0;
};
//支持SQL Server
class SqlConnection: public IDBConnection{
};
class SqlCommand: public IDBCommand{
};
class SqlDataReader: public IDataReader{
};
class SqlDBFactory:public IDBFactory{
public:
virtual IDBConnection* CreateDBConnection();
virtual IDBCommand* CreateDBCommand();
virtual IDataReader* CreateDataReader();
};
//支持Oracle
class OracleConnection: public IDBConnection{
};
class OracleCommand: public IDBCommand{
};
class OracleDataReader: public IDataReader{
};
// ...Oracle的工廠類
class EmployeeDAO{
IDBFactory* dbFactory;
public:
vector<EmployeeDO> GetEmployees(){
IDBConnection* connection =
dbFactory->CreateDBConnection();
connection->ConnectionString("...");
IDBCommand* command =
dbFactory->CreateDBCommand();
command->CommandText("...");
command->SetConnection(connection); //關聯性
IDBDataReader* reader = command->ExecuteReader(); //關聯性
while (reader->Read()){
}
}
};
結構
紅色爲穩定,,藍色與綠色爲兩種系列的變化: