1. 程式人生 > >c++ 設計模式9 (Abstract Factory 抽象工廠模式)

c++ 設計模式9 (Abstract Factory 抽象工廠模式)

構建 數據庫 strac 無需 div exec oracl dfa tle

5.2 抽象工廠模式

動機:在軟件系統中,經常面臨著“一系列相互依賴的對象”的創建工作;同時,由於需求的變化,往往存在更多系列對象的創建工作。

代碼示例:

實現利用數據庫的業務邏輯,支持多數據庫(Sql,Oracle等),有連接、命令、讀取等功能。

其中命令,連接功能之間有相互聯系。

方法一(使用工廠方法):

每個功能類有一個創建的工廠,如IDBConnection與IDBConnectionFactory

技術分享
 1 //數據庫訪問有關的基類
 2 class IDBConnection{
 3     
 4 };
 5 class IDBConnectionFactory{
 6 public:
 7     virtual IDBConnection* CreateDBConnection()=0;
 8 };
 9 
10 
11 class IDBCommand{
12     
13 };
14 class IDBCommandFactory{
15 public:
16     virtual IDBCommand* CreateDBCommand()=0;
17 };
18 
19 
20 class IDataReader{
21     
22 };
23 class IDataReaderFactory{
24 public:
25     virtual IDataReader* CreateDataReader()=0;
26 };
27 
28 
29 //支持SQL Server
30 class SqlConnection: public IDBConnection{
31     
32 };
33 class SqlConnectionFactory:public IDBConnectionFactory{
34     
35 };
36 
37 
38 class SqlCommand: public IDBCommand{
39     
40 };
41 class SqlCommandFactory:public IDBCommandFactory{
42     
43 };
44 
45 
46 class SqlDataReader: public IDataReader{
47     
48 };
49 class SqlDataReaderFactory:public IDataReaderFactory{
50     
51 };
52 
53 //支持Oracle
54 class OracleConnection: public IDBConnection{
55     
56 };
57 
58 class OracleCommand: public IDBCommand{
59     
60 };
61 
62 class OracleDataReader: public IDataReader{
63     
64 };
65 
66 
67 
68 class EmployeeDAO{
69     IDBConnectionFactory* dbConnectionFactory;
70     IDBCommandFactory* dbCommandFactory;
71     IDataReaderFactory* dataReaderFactory;
72     
73     
74 public:
75     vector<EmployeeDO> GetEmployees(){
76         IDBConnection* connection =
77             dbConnectionFactory->CreateDBConnection(...);
78         connection->ConnectionString("...");
79 
80         IDBCommand* command =
81             dbCommandFactory->CreateDBCommand(...);
82         command->CommandText("...");
83         command->SetConnection(connection); //關聯性
84 
85         IDBDataReader* reader = command->ExecuteReader(); //關聯性
86         while (reader->Read()){
87 
88         }
89 
90     }
91 };
技術分享

分析上述代碼,雖然解決了組件創建的問題。但是仔細考慮,由於功能之間具有關聯性,不同類型數據庫的對象並不能同時創建搭配(如sql的command和oracle的connection搭配,顯然不合理)。所以考慮抽象工廠模式。見方法二:

使用一個工廠,將一系列相互依賴的的對象創建在一個工廠中實現。

技術分享
 1 //數據庫訪問有關的基類
 2 class IDBConnection{
 3     
 4 };
 5 
 6 class IDBCommand{
 7     
 8 };
 9 
10 class IDataReader{
11     
12 };
13 
14 
15 class IDBFactory{
16 public:
17     virtual IDBConnection* CreateDBConnection()=0;
18     virtual IDBCommand* CreateDBCommand()=0;
19     virtual IDataReader* CreateDataReader()=0;
20     
21 };
22 
23 
24 //支持SQL Server
25 class SqlConnection: public IDBConnection{
26     
27 };
28 class SqlCommand: public IDBCommand{
29     
30 };
31 class SqlDataReader: public IDataReader{
32     
33 };
34 
35 
36 class SqlDBFactory:public IDBFactory{
37 public:
38     virtual IDBConnection* CreateDBConnection()=0;
39     virtual IDBCommand* CreateDBCommand()=0;
40     virtual IDataReader* CreateDataReader()=0;
41  
42 };
43 
44 //支持Oracle
45 class OracleConnection: public IDBConnection{
46     
47 };
48 
49 class OracleCommand: public IDBCommand{
50     
51 };
52 
53 class OracleDataReader: public IDataReader{
54     
55 };
56 
57 
58 
59 class EmployeeDAO{
60     IDBFactory* dbFactory;
61     
62 public:
63     vector<EmployeeDO> GetEmployees(){
64         IDBConnection* connection =
65             dbFactory->CreateDBConnection();
66         connection->ConnectionString("...");
67 
68         IDBCommand* command =
69             dbFactory->CreateDBCommand();
70         command->CommandText("...");
71         command->SetConnection(connection); //關聯性
72 
73         IDBDataReader* reader = command->ExecuteReader(); //關聯性
74         while (reader->Read()){
75 
76         }
77 
78     }
79 };
技術分享

模式定義:

提供一個接口,讓該接口復雜創建一系列”相關或者相互依賴的對象“,無需指定它們具體的類。

類圖:

技術分享

要點總結:

如果沒有應對”多系列對象構建“的需求變化,則沒有必要使用Abstract Factory模式,這是要使用工廠方法即可。

”系列對象“指的是某一特定系列下的對象之間有相互依賴或作用的關系。不同系列的對象之間不能相互依賴。

Abstract Factory模式主要在於應對”新系列“的需求變動。其缺點在於難以應對”新對象“的需求變動。

c++ 設計模式9 (Abstract Factory 抽象工廠模式)