筆記 - 關于“工廠”的設計模式
放假了不能一直歇著呀,就再次翻了翻《大話設計模式》,之前看了一次感覺是囫圇吞棗,這次挑了有關“工廠”的模式進行“單元復習”,把筆記就記在這吧。
之前看過博客園有人說這本書對某些設計模式理解的其實不完全對,而我是按照這本書理解的;如果讀者對我的理解有異議,歡迎留言。
簡單工廠模式
類圖:
用法:客戶端利用SimpleFactory產生一個具體產品(用AbstractProduct引用),當然這需要客戶端傳參,但判斷邏輯位于SimpleFactory中(如switch語句)。
擴展:若需要增加具體產品E,則須添加ConcreteProductE類,同時修改SimpleFactory。
修改:若需要修改具體產品A,則只需修改ConcreteProductA類。
本書例子:計算器。
工廠方法模式
類圖:
用法:客戶端根據需要的產品選擇工廠(實例化具體工廠A,用AbstractFactory引用),再用該工廠制造產品(用AbstractProduct引用)。
擴展:若需要增加具體產品E,則須添加ConcreteProductE類和ConcreteFactoryE。
修改:直接修改相應產品。
本書例子:雷鋒。
抽象方法模式
類圖:
用法:客戶端根據需要的產品選擇工廠(實例化具體工廠A,用AbstractFactory引用),再用該工廠制造產品(用AbstractProduct引用)。相比而言,抽象工廠模式的好處是易于轉換產品的系列(如由A系列轉換為B系列)。
擴展:若需要增加產品3A和3B,則除了要增加3個類外還要修改FactoryA和FactoryB。若需要增加產品系列C,除了增加相應的類外,還要增加FactoryC類。
修改:直接修改相應的類。
本書例子:遷移數據庫。
抽象方法模式+(與簡單工廠模式結合)
類圖:
用法:客戶端不進行判斷,而是在SimpleFactory中判斷產生A系列還是B系列,這時客戶端可能傳參了,也可能沒傳參,SimpleFactory通過自身的字段或屬性來決定A系列還是B系列。
擴展:若需要增加產品3A和3B,則除了要增加3個類外還要修改SimpleFactory。若需要增加產品系列C,則需要修改SimpleFactory內部代碼(如switch語句)。
修改:直接修改相應的類。
本書例子:遷移數據庫。
抽象方法模式++(與簡單工廠模式結合,再使用“反射”)
在實例化產品時,選擇A系列還是選擇B系列其實只是類名不同,此時使用反射技術能很好地避免出現switch語句,同時使設計盡量適合“開放-封閉”原則。
大概的寫法是:AbstractProduct1 product = (AbstractProductA)Assembly.Load(“AssemblyName”).CreateInstance(“AssemblyName.Product1A”);
其中,AssemblyName為程序集名稱,CreateInstance的參數即我們的變量,我們可以將它存在配置文件中,這樣,我們就能完全不修改程序,只修改配置文件來切換數據庫類型了。
說實在的,剛剛學習設計模式,在練習時還沒有養成設計模式的意識,今后要多多加強!多多練習!多多寫博!





浙公網安備 33010602011771號