設計模式之factory method與c++反射
-記我曾經的誤解
factory method的官方解釋是:
define an inte***ce for creating an object, but let subclasses decide which class to instantiate. factory method lets a class defer instantiation to subclasses
定義乙個介面(creater)來建立乙個物件(object),但是由子類(subcreater)來決定要例項化哪乙個物件(subobject);
這句話相當不好理解,很長一段時間以來我都似懂非懂,括號中的註解是我加上的,這樣前後區分開來,可能對於我這樣笨的人比較有效。
一.設計模式能幹什麼
首先,我會摘抄兩個例子,分別是「簡單工廠」與「工廠方法」,看看設計模式能幹什麼。
參考自:
首先定義產品類及其子類:
class videowiring
class vcd: public videowiring
}class ***: public videowiring
}1.簡單工廠
class create
return null;}}
client端**:
void playvideo()
好處是:
1、充分利用了多型性不管什麼具體產品都返回抽象產品。
2、充分利用了封裝性,內部產品發生變化時外部使用者不會受到影響。
缺點是:如果增加了新的產品,就必須得修改工廠(factory),不滿足閉合原則。
2.工廠方法
class create
class ***create: public create
}class vcdcreate: public create
}client端**:
void playvideo()
工廠方法克服了簡單工廠的缺點,增加新的產品時,不必修改現存的**,而只需增加新**。滿足開閉原則。
二.設計模式不能幹什麼
我們注意到,簡單工廠中的factory方法,用了一串switch-case語句,相當的醜陋,不僅如此,正是由於無法窮舉,導致簡單工廠不能滿足閉合性的要求,設想一下,如果存在以下的語法:
static videowiring* factory(string
videoname)
問題不就解決了,也就不需要後面提到的"factory method「了,實際上,這種」名稱->例項"的對映,就是大名鼎鼎的「反射」,許多語言都提供的屬性,可是,非常不幸,c++沒有!
所以,即便是"factory method」,也只是試圖從另外乙個角度去滿足閉合原則,並沒有解決「名稱->例項"的問題。
考慮乙個實際問題,輸入為乙個資料流inbuffer,可以按照固定格式,分析出它的業務型別typeid,也知道每種業務型別對應的處理類handler,那麼,請問:如何應用設計模式?簡單工廠能夠解決嗎?工廠方法呢?
我的答案是:工廠方法不行,為什麼呢,因為它把」名稱->例項"的對映徹底交給了client,勢必在client端要寫上一長串的switch-case語句,來判斷某個typeid需要建立哪個create,這與簡單工廠中factory方法的switch-case真的有什麼實質性差別嗎?我認為沒有,所以,解決之道不在於設計模式,而在於反射。
三.解決之道
對上述問題,我的解決方法是:簡單工廠+反射,固然,c++中不存在反射的語法,但是,你可以通過某種手段做到類似。
參見:採用的是全域性變數+函式指標+map的做法,可以參考。實際上就是自己建立乙個有限對映集合。
四.我曾經的誤解
很長時間以來,我一直以為工廠方法是為了解決簡單工廠中那個反射問題的,現在才發現不是,至少,不是正面解決,而是避開了,因為它的目標不是為了對付乙個語法問題,而是為了實現開閉原則,不應該認為設計模式能夠增加新的語法特性,它是為了軟體的擴充套件性而存在的。
附:
開閉原則就是乙個軟體實體在擴充套件性方面應該是開放的而在更改性方面應該是封閉的
設計模式之禪之設計模式 門面模式
1 package com.yeepay.sxf.template18 2 3 寫信的業務類 4 隱藏在門面角色裡邊,不需要暴露太多5 author sxf6 7 8public inte ce iletterprocess view code 寫信的業務類的實現 1 package com.yee...
設計模式之禪之設計模式 橋梁模式
1 package com.yeepay.sxf.template24 2 3 實現化角色 4 相當於不同的業務邏輯,抽象出共有行為5 6 產品類7 author sxf8 9 10 public abstract class product view code 房子產品實現 1 package c...
設計模式 設計模式之工廠模式
工廠方法模式 建立模式 使用場景?作用?形態?場景 大量類似的實體類 要建立的實體類都是同一本質的東西 披薩 有部分類似功能 準備 烘烤 切法 實現方式不一樣 準備的材料不同 烘烤時間不同 切法不同 將繁瑣複雜的建立類的過程聚集在一起,有序清晰 把具體例項化的過程從客戶 中抽離 作用 1 將建立物件...