最近在學習設計模式的路上越走越遠...設計模式
今天主要記錄記錄一下學習的工廠模式。iphone
一、由來 ide
當咱們建立一個對象,而這個對象的建立過程序紛繁複雜,可能致使大量的重複代碼的時候,工廠模式出現了。工廠方法模式經過定義一個單獨的建立對象的方法來解決這些問題。由子類實現這個方法來建立具體類型的對象。也就是說,在咱們的實際運用中,工廠就是一個用來建立其餘對象的對象。學習
二、實質this
定義一個建立對象的接口,但讓實現這個接口的類來決定實例化哪一個類。工廠方法讓類的實例化推遲到子類中進行。spa
三、現狀介紹設計
工廠模式目前有三個分支,簡單工廠模式,工廠方法模式和抽象工廠方法模式,其中,我主要學習的是抽象工廠方法模式,由於該方法是工廠模式中最高層的方法。簡單工廠模式,工廠類根據傳參不一樣獲得不一樣的產品。工廠方法模式可以建立這個系列中的各類產品,好比,iphone的各類配件。而抽象工廠模式做爲更高級的模式,它能夠建立整個蘋果公司各個產品流水線,好比,他能夠建立生產iphone配件的工廠,能夠建立生產ipad配件的工廠等等。那麼,抽象工廠模式與工廠方法模式的最大區別就在於,工廠方法模式針對的是一個產品等級結構,它可以建立這一個等級結構中的產品族;而抽象工廠模式則須要面對多個產品等級結構,也就是說,抽象工廠方法模式能夠工廠方法模式中的工廠。code
四、三分支的關係對象
簡單工廠模式一般伴隨着對象的具體類型與工廠具體類型的一一對應,客戶端代碼根據須要選擇合適的具體類型工廠使用。當這個選擇包含複雜的邏輯時,就能夠建立一個單一的工廠類,用以包含這種選擇邏輯,根據參數的不一樣選擇實現不一樣的具體對象。這個工廠類不須要由每一個具體產品實現一個本身的具體的工廠類,因此能夠將工廠方法設置爲靜態方法,這就有了工廠方法模式。而抽象工廠方法模式即是封裝着這樣一組有着共同主題的工廠方法模式中的工廠。blog
一、簡單工廠模式
當咱們的主程序中須要本身手動初始化一個對象,可是咱們並不想關注具體的初始化過程,這個時候簡單工廠模式就是您的選擇。
二、工廠方法模式
當你以爲傳入參數的這種簡單的工廠模式讓你程序容易出錯,而且程序中的if-else讓你的程序看起來有些臃腫,這個時候工廠方法模式就是您的選擇。
三、抽象工廠方法模式
當你工廠類須要修改時,而在工廠方法模式中須要修改原有的工廠類,這就違背了設計原則中的OCP(開放閉合原則),這個時候,抽象工廠方法模式就是您的選擇。
說不如作,看的再多不本身親手作一作來的有效率,這即是我學習工廠模式以後的心得。
首先,模擬場景。建立寶馬車,X6和5系的,那麼首先的有一個抽象的汽車工廠,CarFactory,由它來生成X6和5系的工廠,一個汽車工廠生產出來的汽車至少得有個殼,發動機,變速箱啥的,全部就有了方法。建立CarFactory以下:
1 public interface CarFactory { 2 public CarFrame createCarFrame(); 3 public Engine createEngine(); 4 public Gearbox createGearbox(); 5 }
一個汽車的基本配件都出來了,那麼全部的配件都應該有各自的接口,咱們再分別建立Engine,Gearbox和CarFrame,Engine以下(Gearbox、CarFrame相似):
1 public interface Engine { 2 public void createEngine(); 3 4 }
而後咱們的X6和5系的都應該有這些個接口吧,咱們在分別建立他們各自的Engine,Gearbox和CarFrame,X6的Engine:
1 public class BwmXSixEngine implements Engine { 2 3 private String emissions; 4 5 public BwmXSixEngine(String emissions){ 6 7 this.emissions = emissions; 8 } 9 10 @Override 11 public void createEngine() { 12 System.out.println("this BWM XDrive engine,and emissions is "+ this.emissions); 13 } 14 }
5系的Engine:
1 public class BwmFiveSeriesEngine implements Engine { 2 3 private final String emissions; 4 5 public BwmFiveSeriesEngine(String emissions){ 6 this.emissions = emissions; 7 } 8 9 @Override 10 public void createEngine() { 11 System.out.println("this is BWMFiveSeriesEngine it's emissions of "+this.emissions); 12 } 13 }
如今,X6和5系就只差裝箱,咱們就來建立他們的工廠吧,5系:
1 public class BwmFiveSeriesFactory implements CarFactory{ 2 3 4 @Override 5 public CarFrame createCarFrame() { 6 return new BwmFiveSeriesCarFrame("中大型車", new int[]{5047,1860,1491},"4門5座三廂車"); 7 } 8 9 @Override 10 public Engine createEngine() { 11 return new BwmFiveSeriesEngine("2.0T"); 12 } 13 14 @Override 15 public Gearbox createGearbox() { 16 return new BwmFIveSeriesGearbox("8擋手自一體"); 17 } 18 }
X6:
1 public class BwmXSixFactory implements CarFactory { 2 @Override 3 public CarFrame createCarFrame() { 4 return new BwmXSixCarFrame("中大型SUV",new int[]{4929,1983,1709},"5門5座SUV"); 5 } 6 7 @Override 8 public Engine createEngine() { 9 return new BwmXSixEngine("3.0T"); 10 } 11 12 @Override 13 public Gearbox createGearbox() { 14 return new BwmXSixGearbox("8擋手自一體"); 15 } 16 }
程序寫到這裏也快結束了,咱們本身在寫一個汽車超市來生成這些對象就行了,但願你有一次愉快的購物經歷,哈哈~
在抽象工廠模式的運用中,須要有一個總的抽象工廠,這個工廠製造能夠生產具體東西的工廠類,好比,CarFactory和BwmXSixFactory之間的關係。而後就是接口的運用。接口對於高抽象層級的類有很大做用,站在高處便能規定對繼承該接口的類的行爲,但並不具體到每個繼承的類的行爲。最後,工廠模式成功的隱藏了類的行爲,知足迪米特法則,調用者根本不關心怎麼實現的,只要一個接口能夠調用便行。
本身在設計模式這一塊還比較弱,之後還需多多學習。設計模式每個都不是太難,重要的是各個擊破以後,將他們拿捏在手中可以靈活的運用到實例的工做中。因此,重要的仍是本身能力的提高,加油~
ps:文中如果有哪裏理解不順或是須要改進的地方,望指出~