抽象工廠模式(Abstract Factory Pattern):提供一個建立一系列相關或相互依賴對象的接口,而
無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,它是一種對象建立型模式。git
在抽象工廠模式中,每個具體工廠都提供了多個工廠方法用於產生多種不一樣類型的產品,這些產品構成了一個產品族,抽象工廠模式結構如圖所示:設計模式
同一個品牌的這邊給他算一個產品族,冰箱,電視算兩個產品等級結構,一個具體的工廠實現類能夠產生同一個品牌的不一樣的產品。
產品1接口ide
public interface Fridge { void freeze(); }
產品1實現類1測試
public class HaierFridge implements Fridge { @Override public void freeze() { System.out.println("海爾冰箱冰凍啦"); } }
產品2實現類2設計
public class MediaFridge implements Fridge { @Override public void freeze() { System.out.println("美的冰箱冰凍啦"); } }
產品2接口code
public interface Tv { void watch(); }
產品2實現類1對象
public class HaierTv implements Tv { @Override public void watch() { System.out.println("看海爾電視啦"); } }
產品2實現類2blog
public class MediaTv implements Tv { @Override public void watch() { System.out.println("看美的電視啦"); } }
工廠接口接口
public interface Factory { Tv getTv(); Fridge getFridge(); }
工廠實現類1
public class HaierFactory implements Factory { @Override public Tv getTv() { return new HaierTv(); } @Override public Fridge getFridge() { return new HaierFridge(); } }
工廠實現類2
public class MediaFactory implements Factory { @Override public Tv getTv() { return new MediaTv(); } @Override public Fridge getFridge() { return new MediaFridge(); } }
測試
public class Test { public static void main(String[] args) { //能夠從配置文件中得到具體類名,經過反射得到相應的工廠類來實現其配置化 Factory factory1=new HaierFactory(); factory1.getTv().watch(); factory1.getFridge().freeze(); Factory factory2=new MediaFactory(); factory2.getTv().watch(); factory2.getFridge().freeze(); } } //看海爾電視啦 //海爾冰箱冰凍啦 //看美的電視啦 //美的冰箱冰凍啦
在抽象工廠模式中,增長新的產品族很方便(如添加一個牌子的產品族),可是增長新的產品等級結構(添加洗衣機這個新的產品登記結構)很麻煩,抽象工廠模式的這種性質稱爲「開閉原則」的傾斜性。「開閉原則」要求系統對擴展開放,對修改封閉,經過擴展達到加強其功能的目的,對於涉及到多個產品族與多個產品等級結構的系統,其功能加強包括兩方面:
將具備共同約束的多個產品放在一個族裏,工廠類中能夠產生多個屬於同一個產品族的產品,相比於工廠方法的每一個產品一個工廠類來講可大量減小類的數量。缺點就是不可擴展其餘產品種類。