學習設計模式的乙個硬傷

2021-08-30 14:11:32 字數 1202 閱讀 2488

很多人在學習設計模式,也都能把gof書中的factory, state, singleton, decorator等等說的嘰裡呱啦的,但是很多人其實都不知道怎麼來用設計模式,工作幾年,看過一些優秀的設計,但看過的更多的是濫用模式的設計,大部分人對設計模式的了解也都停留在層面上,在工作中曾有機會去對資歷年長過自己的同行進行過面試,gof中的模式隨便挑一些出來問詢,模式的用途,解決的問題以及優缺點什麼的,大部分都能答個**不離十,但是再往深入點,比如問,state與strategry的區別?或者兩個維度的業務變化可以用bridge來分離,那面對大於兩個維度的業務變化時呢? 對於此類稍微深入點的問題,面試者往往不知如何作答。

或許是交際圈太窄,在現實生活中還沒有接觸到傳說中的大牛,能夠給予點播,以致往往在遇到問題時,只能悶著頭顱去網路中四處尋找,然而網路中大多數人的理解顯然都還是停留在理論層面,甚少有實際運用的例子,以致在某些時候,使用了模式後和使用之前沒多大區別,有點畫蛇添足的味道。

舉個工廠模式的例子,大多數文章都只是描述了工廠模式是什麼,為什麼要用,以及優缺點什麼的,卻唯獨少了描述如何使用。比如說,工廠模式是為了封裝物件的建立,降低具體產品和client的耦合等等,大體上就是說,原先使用new shape的地方, 換成factory建立的方式。

//使用工廠模式前,client呼叫的方式

shape shape=new circle();

//使用工廠模式後,client呼叫的方式

shapefactory factory=new circlefactory();

shape shape=factory.createshape();

從上面的**中,你看出了什麼不對勁的地方了嗎? 如果我們真的這麼來使用工廠模式,那麼使不使用工廠模式沒有什麼兩樣,為什麼? 使用工廠模式前,client的**依賴於具體的產品物件-circle,使用工廠模式後,client的**是不依賴於具體的產品物件-circle了,但是轉而依賴具體的工廠物件-circlefactory了,依賴關係只是轉移了,並沒有降低。 但是這正是網上以及一些書籍中講解工廠模式時所使用的方式,而且鮮有說明其中的緣由。這就造成了很多初學者乃至一些工作了多年的程式設計師都在這樣使用著設計模式。

再舉個策略模式的例子,這是乙個很簡單的模式,但是仍然有很多人不知道策略模式還有乙個context元素,也不知道這個context元素的作用, 既然模式裡包含了這個context,自然有它的用意。所以,對於我來講,未能充分了解其意圖之前,設計模式,還是不用為好。

我學習設計模式的乙個總結

記憶裡是從2010年開始學習 使用設計模式的,之前都是把所有的東西堆到乙個類裡。總的來說,使用設計模式後對寫的 比較容易理解,修改bug時影響的範圍會縮小很多。設計模式在gof中被分為三類 一,創造型 二,結構型 三,行為型 各種軟體設計思想解決的問題都是 解耦和重用。在創造型中,一共有五個模式 1...

每日學習乙個設計模式 迭代器模式

提供乙個物件來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。迭代器模式是一種物件行為型模式,其主要優點如下 抽象聚合 inte ce aggregate 具體聚合 class concreteaggregate implements aggregate public void remo...

state設計模式學習, 乙個C 的實現

state的用意在於,允許乙個物件在其內部狀態改變時改變它的行為 state模擬context的相關行為介面,針對具體的狀態,利用虛函式的機制對映到相應的行為,從而避免大量的條件語句,使得 更加清晰,並且易於維護 當然這樣見帶來大量的子類,維護這些類也是要代價的 這裡我做了乙個簡單的c 實現,模擬門...