抽象工廠模式是全部形態的工廠模式中最爲抽象和最具通常性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式能夠向客戶端提供一個接口,使客戶端在沒必要指定產品的具體的狀況下,建立多個產品族中的產品對象。編程
這裏新增一個概念,**產品族:**是指位於不一樣產品等級結構中,功能相關聯的產品組成的家族。通常是位於不一樣的等級結構中的相同位置上。顯然,每個產品族中含有產品的數目,與產品等級結構的數目是相等的,造成一個二維的座標系,水平座標是產品等級結構,縱座標是產品族。叫作相圖。設計模式
工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構,因此有個產品族的概念。在編程中,一般一個產品結構,表現爲一個接口或者抽象類,也就是說,工廠方法模式中的全部產品都是來自同一個接口或抽象類,而抽象工廠模式中的產品則是來自不一樣的接口或抽象類。bash
抽象工廠模式是工廠方法模式的升級版本,在有多個業務,或者多個分類的狀況下,抽象工廠模式比較適合。微信
前幾天我寫了工廠方法模式的文章,設計模式(2)-工廠方法模式詳解(易懂)ide
文章裏舉例了手機工廠生產手機的例子,咱們繼續用這個例子來分析這兩個模式。ui
首先來回憶一下工廠方法模式的例子:一個手機工廠生產華爲和小米兩種手機,模型圖以下:spa
從模型上能夠發現,兩種手機在一個等級結構,也就是都實現或者集成了同一個接口或抽象類。設計
還以手機爲例,如今加入了手機尺寸的要求,模型以下:code
首先要知道一個概念,產品族,文章開頭我已經定義了。cdn
從上面模型能夠發現:
6.0英寸華爲手機A1與6.0英寸的小米手機B1屬於一個產品族,5.5英寸華爲手機A2與5.5英寸小米手機B2屬於一個產品族;Factory1表示生產6.0英寸的手機,Factory2表示生產5.5英寸的手機。
抽象工廠模式中的抽象工廠類中的建立方法與產品族的個數有關。
有N個產品等級結構就會有N個實現工廠類。
咱們拿上面的抽象工廠實例模型舉例:
1.首先看一下兩種手機的抽象產品類:
public abstract class AbstractHUAWEI {
//華爲手機共同的方法,好比品牌
public void commonMethod(){
}
//相同的方法,不一樣的實現。好比尺寸,型號等等
public abstract void dosomething();
}
複製代碼
public abstract class AbstractMI {
//小米手機共同的方法,好比品牌
public void commonMethod(){
}
//相同的方法,不一樣的實現。好比尺寸,型號等等
public abstract void dosomething();
}
複製代碼
2.兩種手機對應的產品實現類
public class HUAWEI_A1 extends AbstractHUAWEI{
@Override
public void dosomething() {
Log.i("qzs","我是6.0英寸的華爲手機A1");
}
}
public class HUAWEI_A2 extends AbstractHUAWEI {
@Override
public void dosomething() {
Log.i("qzs","我是5.5英寸的華爲手機A2");
}
}
public class MI_B1 extends AbstractMI {
@Override
public void dosomething() {
Log.i("qzs","我是6.0英寸的小米手機B1");
}
}
public class MI_B2 extends AbstractMI {
@Override
public void dosomething() {
Log.i("qzs","我是5.5英寸的小米手機B1");
}
}
複製代碼
3.抽象工廠類
public abstract class AbstractFactory {
//6.0英寸手機
public abstract AbstractHUAWEI createSize1();
//5.5英寸手機
public abstract AbstractMI createSize2();
}
複製代碼
4.兩個工廠實現類
public class Factory1 extends AbstractFactory {
@Override
public AbstractHUAWEI createSize1() {
return new HUAWEI_A1();
}
@Override
public AbstractMI createSize2() {
return new MI_B1();
}
}
複製代碼
public class Factory2 extends AbstractFactory {
@Override
public AbstractHUAWEI createSize1() {
return new HUAWEI_A2();
}
@Override
public AbstractMI createSize2() {
return new MI_B2();
}
}
複製代碼
5.調用
AbstractFactory factory1=new Factory1();
AbstractFactory factory2=new Factory2();
//生產A1
AbstractHUAWEI a1=factory1.createHUAWEI();
// a1.dosomething();
//生產A2
AbstractHUAWEI a2=factory2.createHUAWEI();
// a2.dosomething();
//生產B1
AbstractMI b1=factory1.createMI();
// b1.dosomething();
//生產B2
AbstractMI b2=factory2.createMI();
// b2.dosomething();
複製代碼
從調用類能夠看出,建立的生產對象過程與實現類無關。
1.優勢
隔離了具體類(從調用類的代碼能夠看出),非公開。
增長產品下的系列也就是增長具體的實現工廠類很方便,符合「開閉原則」(好比上面的例子中我在兩種手機下又新增了一個5.0英寸的,直接加一個新的具體工廠類就能夠了)
2.缺點
抽象工廠模式的產品族擴展是很難的,拿上面的手機舉例,若是我增長個一個手機品牌OPPO,那麼由兩個品牌變成三個品牌,試試改一下會發現:首先要更改抽象工廠類,而後會發現全部的類基本上都跟着動了。改變了抽象類和接口,這是大忌!
類文件增長過快
參考資料《大話設計模式》《設計模式之禪》 歡迎你們關注個人微信公衆號:安卓乾貨鋪