設計模式筆記9:抽象工廠

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()){

        }

    }
};

結構

紅色爲穩定,,藍色與綠色爲兩種系列的變化:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章