接着上一次工廠模式來說說抽象工廠模式。
首先抽象工廠模式和工廠模式一樣是屬於創建型模式,也就是說它的目的也是用來創建對象的,其實我覺得說用來管理對象的創建更為恰當一些。
為什么要有了工廠模式之后還要有抽象工廠模式?
因為更方便,更合理,更加低耦合,我舉個例子來說明一下。
假設目前你的程序里面有兩個對象,蘋果(apple)和香蕉(banana),那么你使用工廠模式就已經足夠了,因為她們屬於同一個品類,都屬於水果,如果在添加一個菠蘿產品,也只需要把菠蘿加入到你的
水果工廠里面就夠了。
但是如果你程序里面有四個對象,蘋果汁,蘋果派,香蕉汁,香蕉派,這四個對象正好有明確的層級關系,可以抽象為兩個層級,蘋果,香蕉,或者果汁,派。這時候你怎么來創建這些對象呢?這時候工廠模式明顯已經不適用了,因為工廠模式是對象都實現了同一個接口,這時候就可以使用抽象工廠模式了。
具體怎么做呢?
就是把對象抽象一下,把這四個對象抽象為兩個接口,一個果汁接口,一個派的接口。
然后再設計一個抽象的工廠(抽象類)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,勉強算是概念圖,有點丑。。。