抽象工廠模式

抽象工廠模式介紹:

抽象工廠模式(Abstract Factory Pattern)起源于以前對不同操作系統(tǒng)的圖形化解決方案,如不同的操作系統(tǒng)中的按鈕和文件框控件其實現不同,展示效果也不一樣句葵,對于每個操作系統(tǒng),其本身就構成一個產品類兢仰,而按鈕和文本框控件也構成一個產品類乍丈,兩種產品類兩種變化,各自有各自的特點把将,如Android 中的Button 和TextView轻专,iOS中的Button 和 TextView,Windows Phone中的Button 和TextView等察蹲。

抽象工廠模式的定義:

為創(chuàng)建一組相關或是相互依賴的對象提供一個接口请垛,而不需要指定它們的具體類。

抽象工廠模式的UML類圖:

image.png

由UML圖可以得出如下抽象工廠模式的通用模式代碼洽议。

抽象產品類A
/**
 * @ClassName AbstractProductA
 * @Description 抽象產品類A
 * @Author lm
 * @Date 2018/9/13 0013 23:51
 * @Version 1.0
 **/
public abstract class AbstractProductA {
    /**
     * 每個具體的產品子類需要實現的方法
     */
    public abstract void method();
}
抽象產品類B
/**
 * @ClassName AbstractProductB
 * @Description 抽象產品類B
 * @Author lm
 * @Date 2018/9/13 0013 23:53
 * @Version 1.0
 **/
public abstract class AbstractProductB {
    /**
     * 每個具體的產品子類需要實現的方法
     */
    public abstract void method();
}
具體產品類A1
/**
 * @ClassName ConcreteProductA1
 * @Description 具體產品類A1
 * @Author lm
 * @Date 2018/9/13 0013 23:55
 * @Version 1.0
 **/
public class ConcreteProductA1 extends AbstractProductA {

    @Override
    public void method() {
        System.out.println("具體產品A1的方法");
    }
}
具體產品類A2
/**
 * @ClassName ConcreteProductA2
 * @Description 具體產品類A2
 * @Author lm
 * @Date 2018/9/13 0013 23:55
 * @Version 1.0
 **/
public class ConcreteProductA2 extends AbstractProductA {

    @Override
    public void method() {
        System.out.println("具體產品A2的方法");
    }
}
具體產品類B1
/**
 * @ClassName ConcreteProductB1
 * @Description 具體產品類B1
 * @Author lm
 * @Date 2018/9/13 0013 23:55
 * @Version 1.0
 **/
public class ConcreteProductB1 extends AbstractProductB {

    @Override
    public void method() {
        System.out.println("具體產品B1的方法");
    }
}
具體產品類B2
**
 * @ClassName ConcreteProductB2
 * @Description 具體產品類B2
 * @Author lm
 * @Date 2018/9/13 0013 23:55
 * @Version 1.0
 **/
public class ConcreteProductB2 extends AbstractProductB {

    @Override
    public void method() {
        System.out.println("具體產品B2的方法");
    }
}
抽象工廠類
/**
        * @ClassName AbstractFactory
        * @Description TODO
        * @Author lm
        * @Date 2018/9/14 0014 0:03
        * @Version 1.0
        **/
public abstract class AbstractFactory {
    /**
     * 創(chuàng)建產品A的方法
     * return 產品A對象
     */
    public abstract AbstractProductA createProductA();

    /**
     * 創(chuàng)建產品B的方法
     * return 產品B對象
     */
    public abstract AbstractProductB createProductB();

}
具體工廠類1
/**
 * @ClassName ConcreteFactory1
 * @Description 具體工廠類1
 * @Author lm
 * @Date 2018/9/14 0014 0:06
 * @Version 1.0
 **/
public class ConcreteFactory1 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    }
}
具體工廠類2
/**
 * @ClassName ConcreteFactory2
 * @Description 具體工廠類2
 * @Author lm
 * @Date 2018/9/14 0014 0:06
 * @Version 1.0
 **/
public class ConcreteFactory2 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ConcreteProductB2();
    }
}

抽象工廠模式的主要角色類:

【1】AbstractFactory:

抽象工廠角色宗收,它聲明了一組用于創(chuàng)建一種產品的方法,每一個方法對應一種產品亚兄,如上述類圖中的AbstractFactory中就定義了兩種方法混稽,分別創(chuàng)建產品A和產品B。

【2】ConcreteFactory:

具體工廠角色审胚,它實現了在抽象工廠中定義的創(chuàng)建產品的方法匈勋,生成一組具體產品,這些產品構成了一個產品種類膳叨,每一個產品都位于某個產品等級結構中洽洁,如上述類圖中的ConcreteFactory1和ConcreteFactory2。

【3】AbstractProduct:

抽象產品角色菲嘴,它為每種產品聲明接口饿自,比如上述類圖中的AbstractProductA和AbstractProductB碎浇。

【4】ConcreteProduct:

具體產品角色,它定義具體工廠生產的具體產品對象璃俗,實現抽象產品接口中聲明的業(yè)務方法奴璃,如上述類圖中的ConcreteProductA1、ConcreteProductA2城豁、ConcreteProductB1苟穆、ConcreteProductB2。

總結:

【1】抽象工廠方法模式的優(yōu)點:
一個顯著的優(yōu)點是分離接口與實現唱星,客戶端使用抽象工廠來創(chuàng)建需要的對象雳旅,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的接口編程而已间聊,使其從具體的產品實現中解耦攒盈,同時基于接口與實現的分離,使抽象該工廠方法模式在切換產品類時更加靈活哎榴,容易型豁。
【2】抽象工廠方法模式的缺點:
一是類文件的爆炸性增加,二是不太容易擴展新的產品類尚蝌,因為每當增加一個產品類就需要修改抽象工廠迎变,那么所有的具體工廠類均會被修改。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末飘言,一起剝皮案震驚了整個濱河市衣形,隨后出現的幾起案子,更是在濱河造成了極大的恐慌姿鸿,老刑警劉巖谆吴,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異苛预,居然都是意外死亡句狼,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門碟渺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲜锚,“玉大人,你說我怎么就攤上這事苫拍∥叻保” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵绒极,是天一觀的道長骏令。 經常有香客問我,道長垄提,這世上最難降的妖魔是什么榔袋? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任周拐,我火速辦了婚禮,結果婚禮上凰兑,老公的妹妹穿的比我還像新娘妥粟。我一直安慰自己,他們只是感情好吏够,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布勾给。 她就那樣靜靜地躺著,像睡著了一般锅知。 火紅的嫁衣襯著肌膚如雪播急。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天售睹,我揣著相機與錄音桩警,去河邊找鬼。 笑死昌妹,一個胖子當著我的面吹牛捶枢,可吹牛的內容都是我干的。 我是一名探鬼主播捺宗,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼柱蟀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚜厉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤畜眨,失蹤者是張志新(化名)和其女友劉穎昼牛,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體康聂,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡贰健,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了恬汁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伶椿。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氓侧,靈堂內的尸體忽然破棺而出脊另,到底是詐尸還是另有隱情,我是刑警寧澤约巷,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布偎痛,位于F島的核電站,受9級特大地震影響独郎,放射性物質發(fā)生泄漏踩麦。R本人自食惡果不足惜枚赡,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谓谦。 院中可真熱鬧贫橙,春花似錦、人聲如沸反粥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽星压。三九已至践剂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娜膘,已是汗流浹背逊脯。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竣贪,地道東北人军洼。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像演怎,于是被迫代替她去往敵國和親匕争。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容