在C#裡,當我們使用工廠模式把實作類別隱藏起來,
統一使用父類別當容器時,通常就是宣告父類別變數,
再new出子類別物件指派給父類別變數就好,
但是在C++中由於有指標的關係,需特別注意宣告的格式。
舉個例子,我現在要建構一個和硬體溝通的介面給上層使用,名叫HWHandshake,
實作這個介面可以使用不同的library來完成,可以透過兩個市售軟體VISA或Jungo來實現,
架構如下所示:
於是在程式碼中我們會在HWHandshake宣告AbstractIO型別的變數hsObj,
用來裝VISAIO或JungoIO的實體,如下:
奇怪了,宣告變數而已,為什麼會有問題呢?這是因為C++中宣告物件實體有兩種方式,
一種是透過類別名稱直接宣告的物件,
生命週期只存在前後大括號中,記憶體存放在stack中,系統會在不需使用時自動清除,
一種是透過new建立實體並指派給指標變數的動態物件,
生命週期必須自己掌控,記憶體則存在於heap中,使用delete時才會清除。
而抽象類別是不能實體化的,也就是不能生成物件,
因此直接用抽象類別宣告變數,就等同想建立抽象類別的物件(實體化),
這是不被允許的。
既然知道原因,就知道該怎麼解決問題了,
因為我想實體化的是子類別,但想用抽象類別變數指向子類別實體物件,
那就是把抽象類別宣告成指標,去指向子類別的實體物件就好囉。
那實際工廠方法怎麼實做呢?
來看HWHandshake的建構子。
宣告:
實作:
加上策略模式的概念,讓切換底層類別時能夠只改變參數就達成。
這樣使用HWHandshake的使用者,
就不需要知道抽象類別(AbstractIO)與實際實作的類別(VISA、Jungo)有哪些,
只需要知道HWHandshake類別與他能提供的實作方式(IOToolType內所定義的)有哪幾種,
就可以操作硬體IO了,且切換快速!
參考資料:Simple Factory Pattern 簡單工廠模式 與 Strategy Pattern 策略模式 使用方式
參考資料:Stack 與 Heap 有何差別
沒有留言:
張貼留言