天天看點

設計模式 簡單工廠 工廠 抽象工廠

1 簡單工廠模式

設計模式 簡單工廠 工廠 抽象工廠

簡單工廠模式又叫靜态工廠模式,但不屬于23種設計模式之一。

簡單來說就是有一個類,提供一個建立方法createProduct,根據接收到的值決定執行個體化哪個類,但是這個簡單工廠類能執行個體化的類必須都是同一個抽象類下的子類

設計模式 簡單工廠 工廠 抽象工廠

在JDK的類庫中廣泛使用了這個模式,比如DateFormat,可以看到根據傳入的參數不同,傳回不同DateFormat類的子類

設計模式 簡單工廠 工廠 抽象工廠

為了便于學習,代碼都寫在一個檔案下

拓展:開閉原則

    程式對于拓展是開放的,對于修改是封閉的,核心觀點:拓展優于修改

優點:實作了對象的建立和使用的分離,建立完全交給專門的工廠類負責,用戶端程式員無需關心對象如何建立,隻需要關心怎麼使用

缺點:簡單工廠模式不夠靈活,每次新增産品類就要修改工廠類的判斷邏輯,如果産品類很多,這個邏輯就會很複雜,同時修改工廠類違反了開閉原則

2 工廠模式

設計模式 簡單工廠 工廠 抽象工廠

簡單來說就是隻定義一個工廠類接口,再實作接口得到不同的子工廠類,讓子工廠類分别負責不同的産品類的建立,而這些産品類依然屬于同一個接口下不同的實作類

設計模式 簡單工廠 工廠 抽象工廠

簡單工廠模式

建立一個工廠類,每當新增一個産品類時就要修改工廠類

設計模式 簡單工廠 工廠 抽象工廠

工廠模式

定義一個工廠接口,隻給出工廠類要實作的方法,而不再負責建立對象,轉而由工廠接口的各個實作類去建立對象,每當新增一個産品類時,隻需要建立一個新的工廠類

設計模式 簡單工廠 工廠 抽象工廠

最常見的集合類Collection隻是一個接口,對應着就是一個工廠接口,而具體的子類比如Arraylist,實作collection接口,就是一個實作了工廠接口的工廠類。

ArrayList能建立itr的執行個體,而itr是Iterator的實作類,是以整個過程就是一個工廠模式的運用。

設計模式 簡單工廠 工廠 抽象工廠

類圖如下

collection就是抽象工廠,具體工廠就是LinkedList,ArrayList,Iteratior就是抽象産品,具體産品就是ListItr和Itr,他們分别由LinkedList和ArrayList建立

設計模式 簡單工廠 工廠 抽象工廠

為了便于學習,将代碼都放在一個檔案下

優點:解決了簡單工廠模式違反開閉原則的問題

缺點:工廠模式的每一個子工廠類隻能建立固定的某個産品類,每當新增産品類時,就得新增一個子工廠類

3 抽象工廠模式

簡單來說就是令工廠類和産品類原本一對一的關系變成了一對多,但是如果要擴充産品類,那麼還是要修改工廠接口和各個子工廠類的代碼,違反開閉原則

設計模式 簡單工廠 工廠 抽象工廠

抽象工廠模式解決了工廠模式的工廠類和産品類一一對應的缺點,每個工廠類可以建立其他産品類,但是抽象工廠模式的擴充性和簡單工廠模式一樣差,會違反開閉原則。

工廠方法模式對具體産品可擴充,抽象工廠模式對具體産品族可擴充

抽象工廠模式隻是工廠模式的一個擴充,如果隻有一個産品類,那麼抽象工廠模式就會退化成工廠模式

設計模式 簡單工廠 工廠 抽象工廠