我的博客原文:
建立型模式:抽象工廠java
五大建立型模式之三:抽象工廠。git
姓名 :抽象工廠github
英文名 :Abstract Factory Pattern設計模式
價值觀 :無論你有多少產品,給我就是了ide
我的介紹 :設計
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
爲建立一組相關或相互依賴的對象提供一個接口,並且無須指定它們的具體類。
(來自《設計模式之禪》)code
今天講的是抽象工廠模式,小夥伴可能有疑問,抽象工廠和工廠方法之間都有工廠,那確定是有什麼聯繫的,具體是什麼關係呢?簡單的說:工廠方法是在解決一個產品多個層級方面的事情;而抽象工廠致力於解決多個產品多個層級方面的事情。舉個例子:汽車是由不少零件組成的,好比引擎、輪胎、方向盤等等。如今若是咱們是輪胎生產方,要生產寶馬輪胎和奔馳輪胎,要用工廠方法仍是抽象工廠實現呢?答案是:工廠方法。輪胎是一個產品,寶馬輪胎和奔馳輪胎是 2 個不一樣層級的輪胎,因此用工廠方法解決就足夠。假如如今咱們是汽車生產方,要生產寶馬汽車和奔馳汽車,汽車又包含輪胎和方向盤等等,要用哪一個來實現?既然是上面的是工廠方法,那這個就用抽象工廠,由於這涉及到多個產品(輪胎、方向盤等等)和 2 個層級(寶馬和奔馳)。這裏尚未講抽象工廠的概念就說了工廠方法和抽象方法的區別,是否是有點陌生?嗯,先記住這個概念,分清楚二者的區別。在不一樣場景使用不一樣的設計模式。對象
上面定義中:爲建立一組相關或相互依賴的對象提供一個接口。這樣子理解這句話,好比上面說的輪胎和方向盤,寶馬汽車用的輪胎和方向盤須要都是寶馬品牌的,也就是說在安裝寶馬汽車的輪胎和方向盤的時候,得用寶馬生產的輪胎和方向盤,重要的一點是:輪胎和方向盤是互相依賴的,不能在寶馬汽車上安裝奔馳輪胎和寶馬方向盤,由於有這個依賴關係,因此咱們須要提供一個額外的接口,來保證寶馬汽車使用的輪胎和方向盤都是寶馬生產的。這就是抽象工廠乾的事情。接口
上面用汽車安裝輪胎和方向盤的例子,那這裏爲了讓你們能深刻理解,就不用其餘例子了。在一個設計模式講解的過程當中,我以爲用一個案例來說解能夠減小讀者的閱讀理解成本,爲了寫設計模式這一系列文章,看了很多設計模式方面的書籍,有些書籍在講解一個設計模式的時候,用了不止一個例子,讀完以後印象不是很深入。這個系列寫完以後,想要的效果是:不須要記住設計模式的定義,把這些故事以及故事對應是講哪一個設計模式都記住了,就真正掌握了這些內容了。ci
public class AbstractFactoryTest { public static void main(String[] args) { // 寶馬員工安裝輪胎和方向盤 AbstractCarFactory bmwCarFacatory = new BMWCarFactory(); bmwCarFacatory.installWheel(); bmwCarFacatory.installSteeringWheel(); // 奔馳員工安裝輪胎和方向盤 AbstractCarFactory mercedesCarFacatory = new MercedesCarFacatory(); mercedesCarFacatory.installWheel(); mercedesCarFacatory.installSteeringWheel(); } } /** * 汽車抽象工廠 */ interface AbstractCarFactory { void installWheel(); void installSteeringWheel(); } /** * 寶馬工廠 */ class BMWCarFactory implements AbstractCarFactory { @Override public void installWheel() { WheelFacatory wheelFacatory = new BMWWheelFacatory(); String wheel = wheelFacatory.createWheel(); System.out.println("安裝輪胎:" + wheel); } @Override public void installSteeringWheel() { SteeringWheelFacatory steeringWheelFacatory = new BMWSteeringWheelFacatory(); String steeringWheel = steeringWheelFacatory.createSteeringWheel(); System.out.println("安裝方向盤:" + steeringWheel); } } /** * 奔馳工廠 */ class MercedesCarFacatory implements AbstractCarFactory { @Override public void installWheel() { WheelFacatory wheelFacatory = new MercedesWheelFacatory(); String wheel = wheelFacatory.createWheel(); System.out.println("安裝輪胎:" + wheel); } @Override public void installSteeringWheel() { SteeringWheelFacatory steeringWheelFacatory = new MercedesSteeringWheelFacatory(); String steeringWheel = steeringWheelFacatory.createSteeringWheel(); System.out.println("安裝方向盤:" + steeringWheel); } } /** * 輪胎工廠 */ interface WheelFacatory { String createWheel(); } /** * 寶馬輪胎工廠 */ class BMWWheelFacatory implements WheelFacatory { @Override public String createWheel() { System.out.println("寶馬輪胎工廠生產輪胎"); return "寶馬輪胎"; } } /** * 奔馳輪胎工廠 */ class MercedesWheelFacatory implements WheelFacatory { @Override public String createWheel() { System.out.println("奔馳輪胎工廠生產輪胎"); return "奔馳輪胎"; } } /** * 方向盤工廠 */ interface SteeringWheelFacatory { String createSteeringWheel(); } /** * 寶馬方向盤工廠 */ class BMWSteeringWheelFacatory implements SteeringWheelFacatory { @Override public String createSteeringWheel() { System.out.println("寶馬方向盤工廠生產方向盤"); return "寶馬方向盤"; } } /** * 奔馳方向盤工廠 */ class MercedesSteeringWheelFacatory implements SteeringWheelFacatory { @Override public String createSteeringWheel() { System.out.println("奔馳方向盤工廠生產方向盤"); return "奔馳方向盤"; } }
代碼:
仍是和以往同樣,思惟開拓一下,這裏列舉的是給汽車安裝輪胎和方向盤,汽車不止這些,若是要加個安裝引擎呢?要怎麼實現?這裏我就不寫出來了,讓小夥伴嘗試一下,寫出來了就理解抽象模式這個設計模式啦。
簡單工廠、工廠方法、抽象工廠這幾個工廠相關的設計模式的基本內容都講完了,這幾個模式都是爲了解耦,爲了可擴展。這裏要着重說一下,三者之間沒有好壞之分,只有在具體的場景才能發揮它們各自的優點。在單產品多層級,層級數量很少的狀況下,可使用簡單工廠,層級多且須要支持擴展,可使用工廠方法;在多產品多層級,可使用抽象工廠。
參考資料:《大話設計模式》、《Java設計模式》、《設計模式之禪》、《研磨設計模式》、《Head First 設計模式》
推薦閱讀:
建立型模式:單例模式
建立型模式:工廠方法
但願文章對您有所幫助,設計模式系列會持續更新,感興趣的同窗能夠關注公衆號,第一時間獲取文章推送閱讀,也能夠一塊兒交流,交個朋友。