工廠模式已經分析了簡單工廠模式和工廠方法模式。而且瞭解了工廠方法模式去簡單工廠模式的延伸,工廠方法模式若是不把工廠類抽象的話,就是簡單工廠模式。由前面兩個工廠模式能夠猜想出抽象工廠模式應該是這兩種工廠模式的另一個變化。先來看一下它的定義。設計模式
提供一個建立一系列相關或相互依賴的對象的接口,而無需指定它們具體的類。ide
先簡單介紹一下定義的意思,就是須要建立一個接口,這個接口的做用就是用來建立一個以上的對象的,而且這些對象是相互依賴的,還不須要指定它們具體實現的類,應該是別建立對象的類。爲了更好的理解,就用急速PDF閱讀器切換皮膚爲例子來介紹一下。spa
切換皮膚有多個地方是同時變更風格的。爲了例子的簡潔易懂,就那下面那個地方爲例設計
很容易看出來,皮膚修改這二個是相互關聯的,相互依賴的。否則出來的效果就是似是而非了。code
給出切換皮膚須要配置的三個部分的類對象
//系統背景接口(產品A) public interface SystemBackground { public String controlStyle(); } //系統頭部(產品B) public interface SystemHead { public String controlStyleB(); } //系統簡潔大氣背景風格 (產品A1) public class SystemBackgroundImplA implements SystemBackground { @Override public String controlStyle() { // TODO Auto-generated method stub return "簡潔大氣的背景風格"; } } //系統中國風背景(產品A2) public class SystemBackgoundImplB implements SystemBackground{ @Override public String controlStyle() { // TODO Auto-generated method stub return "中國風的背景風格"; } } //系統簡潔大氣頭部(產品B1) public class SystemHeadImplA implements SystemHead { @Override public String controlStyleB() { // TODO Auto-generated method stub return "簡潔大氣的系統頭部"; } } //系統中國風頭部(產品B2) public class SystemHeadImplB implements SystemHead { @Override public String controlStyleB() { // TODO Auto-generated method stub return "中國風的系統頭部"; } }
工廠類blog
//工廠接口 public interface SkinFactory { public void createBackgroundSkin(); public void createHeadSkin(); } //簡潔大氣皮膚工廠類 public class SkinFactoryJjdq implements SkinFactory { @Override public void createBackgroundSkin() { // TODO Auto-generated method stub SystemBackground sbg = new SystemBackgroundImplA(); System.out.println("切換了"+sbg.controlStyle()); } @Override public void createHeadSkin() { // TODO Auto-generated method stub SystemHead sh = new SystemHeadImplA(); System.out.println("切換了"+sh.controlStyleB()); } } //中國風皮膚工廠類 public class SkinFactoryZgf implements SkinFactory { @Override public void createBackgroundSkin() { SystemBackground sbg = new SystemBackgoundImplB(); System.out.println("切換了"+sbg.controlStyle()); } @Override public void createHeadSkin() { // TODO Auto-generated method stub SystemHead sh = new SystemHeadImplB(); System.out.println("切換了"+sh.controlStyleB()); } }
客戶端調用繼承
public class Client { public static void main(String[] args) { SkinFactory sf = new SkinFactoryJjdq(); //簡潔大氣 System.out.println("--------開始切換【簡潔大氣】皮膚-----------"); sf.createHeadSkin(); sf.createBackgroundSkin(); System.out.println("*******切換【簡潔大氣】皮膚結束"); //中國風 System.out.println("\n --------開始切換【中國風】皮膚-----------"); sf = new SkinFactoryZgf(); sf.createHeadSkin(); sf.createBackgroundSkin(); System.out.println("++++++++切換【中國風】皮膚結束"); } }
這個例子就是抽象工廠模式的所要解決的問題。把這個例子結構展現出來,能夠更好的理解抽象工廠。接口
經過結構圖看出來,工廠類有兩個方法來建立產品類,而且這兩個方法建立的對象是相互關聯的。抽象工廠模式重點就在建立相互關聯的對象。還拿例子來講,能夠看出來工廠類有兩個工廠方法。就是建立兩個對象。可是不是隨意建立的。他們是相互關聯的,若是工廠類中一個建立的是簡潔大氣的頭部皮膚,另一個是中國風的背景。那出來的皮膚確定就不是一個成功的產品了。因此他們必定是相互關聯的。若是理解了工廠方法模式,那麼對於抽象工廠模式來講,只要理解建立相互關聯的對象這部分。就基本理解了抽象工廠模式要解決問題的本質。產品
若是產品族橫向擴展(對於這個例子增長新的皮膚),那麼添加新的具體工廠實現工廠就扣便可;縱向擴展(對於本例子來講,就是修改皮膚不只是系統頭部和背景,還有另外的依賴部分,好比滑動杆樣式),這就須要修改工廠類了。
三個工廠模式是相互關聯的,簡單工廠是工廠模式中的最簡單的一些表達。他的任務就是把須要建立的對象和調用地方解耦。簡單工廠類充當橋樑做用,沒有考慮其餘更多的問題。可是他有弊端,就是不能靈活擴展,只要想擴展,就須要修改工廠類。
爲了解決這個問題,就發展了工廠方法模式。把工廠類用抽象類表示,實現具體的產品就用繼承抽象工廠類的具體工廠來負責,這樣就解決了簡單工廠裏面的擴展問題。
業務場景紛繁複雜,須要建立的對象也多是複雜的,爲了完成必定功能,須要建立相互關聯的多個類。因而,在工廠方法模式基礎上,讓工廠類實現多個工廠方法。他們建立的對象相互關聯共同完成特定功能。這就變成了抽象工廠模式。
至此,工廠模式系統已經介紹完畢,他們都屬於建立者模式。簡單工廠模式和工廠方法模式使用的場景基本沒有什麼區別,只是當業務複雜,考慮擴展時候。就捨棄簡單工廠而選用工廠方法模式。我的認爲很系統應該也是重構發展的。一個場景可能開始用的簡單工廠模式,可是隨着系統不斷髮展,爲了更靈活擴展,就修改爲工廠方法模式。抽象工廠類使用場景看似很清晰,使用也是在系統不斷擴展使用場景漸漸清晰的。工廠模式到這裏了,若是之後發現沒有理解到部分,再進行補充進來