接着上一次工廠模式來講說抽象工廠模式。app
首先抽象工廠模式和工廠模式同樣是屬於建立型模式,也就是說它的目的也是用來建立對象的,其實我以爲說用來管理對象的建立更爲恰當一些。ide
爲何要有了工廠模式以後還要有抽象工廠模式?ui
由於更方便,更合理,更加低耦合,我舉個例子來講明一下。spa
假設目前你的程序裏面有兩個對象,蘋果(apple)和香蕉(banana),那麼你使用工廠模式就已經足夠了,由於她們屬於同一個品類,都屬於水果,若是在添加一個菠蘿產品,也只須要把菠蘿加入到你的設計
水果工廠裏面就夠了。code
可是若是你程序裏面有四個對象,蘋果汁,蘋果派,香蕉汁,香蕉派,這四個對象正好有明確的層級關係,能夠抽象爲兩個層級,蘋果,香蕉,或者果汁,派。這時候你怎麼來建立這些對象呢?這時候工廠模式明顯已經不適用了,由於工廠模式是對象都實現了同一個接口,這時候就可使用抽象工廠模式了。對象
具體怎麼作呢?blog
就是把對象抽象一下,把這四個對象抽象爲兩個接口,一個果汁接口,一個派的接口。繼承
而後再設計一個抽象的工廠(抽象類)abstractFactory,裏面生產抽象的對象(也就是接口)Juice,Pie,單看這個結構就是一個工廠模式,可是咱們要用生產的是對象而不是接口。接口
因此咱們還須要兩個具體工廠:
一個AppleFactory繼承abstractFactory,實現生成Pie的方法和生成Juice的方法,實際上就是生成對象AppleJuice和ApplePie,
一個BananaFactory繼承abstractFactory,實現生成Pie的方法和生成Juice的方法,實際上就是生成對象BananaJuice和BananaPie,
這樣的話,對於調用者來講,我在開發過程當中,只須要知道我操做的對象是Pie或者是Juice就夠了,這樣下降了耦合。
下面看下代碼,首先是調用點。
package abstractFactory; /** * Created by songjian on 3/30/2016. */ public class Test { public static void main(String args[]){ AbstractFactory factory1 = new AppleFactory(); factory1.createJuice().desc(); factory1.createPie().desc(); //假設咱們以前須要的是applePie和appleJuice對象,如今須要換成bananaPie和BananaJuice對象 //咱們只須要替換對應的實現工廠(把new AppleFactory換成new BananFactory就能夠了,耦合比較低) AbstractFactory factory2 = new BananaFactory(); factory2.createJuice().desc(); factory2.createPie().desc(); } }
下面是抽象工廠,生產對象的抽象。
package abstractFactory; /** * Created by songjian on 3/29/2016. */ public abstract class AbstractFactory { abstract Juice createJuice(); abstract Pie createPie(); }
下面是具體工廠兩個
package abstractFactory; /** * Created by songjian on 3/29/2016. */ public class AppleFactory extends AbstractFactory{ @Override Juice createJuice() { return new AppleJuice(); } @Override Pie createPie() { return new ApplePie(); } }
package abstractFactory; /** * Created by songjian on 3/29/2016. */ public class BananaFactory extends AbstractFactory{ @Override Juice createJuice() { return new BananaJuice(); } @Override Pie createPie() { return new BananaPie(); } }
下面是對象抽象出來的接口兩個
package abstractFactory; /** * Created by songjian on 3/29/2016. */ public interface Juice { public void desc(); }
package abstractFactory; /** * Created by songjian on 3/29/2016. */ public interface Pie { public void desc(); }
最後是咱們要生產的四個對象。
package abstractFactory; /** * Created by ken on 1/29/2016. */ public class AppleJuice implements Juice { @Override public void desc() { System.out.println("蘋果汁."); } }
package abstractFactory; /** * Created by ken on 1/29/2016. */ public class ApplePie implements Pie { @Override public void desc() { System.out.println("蘋果派"); } }
package abstractFactory; /** * Created by ken on 1/29/2016. */ public class BananaJuice implements Juice { @Override public void desc() { System.out.println("香蕉汁."); } }
package abstractFactory; /** * Created by ken on 1/29/2016. */ public class BananaPie implements Pie { @Override public void desc() { System.out.println("香蕉派"); } }
而後最後,再配上一張,我以爲能夠幫助理解的圖,沒有用UML,勉強算是概念圖,有點醜。。。