Android 抽象工廠模式

源碼地址

使用場景

一個對象族有相同的約束時可以使用此模式嘱巾。

例如:Android嘴纺、iOS 都有短信軟件和撥號軟件,但是具體代碼的實現(xiàn)邏輯不不一樣浓冒,這個時候可以考慮使用抽象工廠模式來生產(chǎn) Android栽渴、iOS 下的短信軟件和撥號軟件。

主要角色

AbstractFactory:抽象工廠角色稳懒。對應(yīng) AbstractFactory闲擦。

ConcreteFactory:具體工廠角色。對應(yīng) ConcreteFactory1 和 ConcreteFactory2场梆。

AbstractProduct:抽象產(chǎn)品角色墅冷。對應(yīng) AbstractProductA 和 AbstractProductB。

ConcreteProduct:具體產(chǎn)品角色或油。對應(yīng) ConcreteProductA1寞忿、ConcreteProductA2、 ConcreteProductB1顶岸、ConcreteProductB2腔彰。

示例代碼:

抽象產(chǎn)品類A

public abstract class AbstractProductA {
    /**
     * 每個具體的產(chǎn)品子類需要實現(xiàn)的方法
     */
    public abstract void method();
}

抽象產(chǎn)品類B

public abstract class AbstractProductB {
    /**
     * 每個具體的產(chǎn)品子類需要實現(xiàn)的方法
     */
    public abstract void method();
}

具體產(chǎn)品類A1

public class ConcreteProductA1 extends AbstractProductA {
    @Override
    public void method() {
        System.out.println("具體產(chǎn)品A1的方法");
    }
}

具體產(chǎn)品類A2

public class ConcreteProductA2 extends AbstractProductA {
    @Override
    public void method() {
        System.out.println("具體產(chǎn)品A2的方法");
    }
}

具體產(chǎn)品類B1

public class ConcreteProductB1 extends AbstractProductB {
    @Override
    public void method() {
        System.out.println("具體產(chǎn)品B1的方法");
    }
}

具體產(chǎn)品類B2

public class ConcreteProductB2 extends AbstractProductB {
    @Override
    public void method() {
        System.out.println("具體產(chǎn)品B2的方法");
    }
}

抽象工廠類

public abstract class AbstractFactory {
    /**
     * 創(chuàng)建產(chǎn)品A的方法
     */
    public abstract AbstractProductA createProductA();

    /**
     * 創(chuàng)建產(chǎn)品B的方法
     */
    public abstract AbstractProductB createProductB();
}

具體工廠1

public class ConcreteFactory1 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }

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

具體工廠2

public class ConcreteFactory2 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }

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

簡單實現(xiàn)

需求:小明的車廠需要生產(chǎn)Q3叫编、Q7兩種類型的汽車,但是它們的零部件差別比較大霹抛。比如輪胎搓逾、發(fā)動機、制動系統(tǒng)杯拐。

  1. 輪胎相關(guān)類

    public interface ITire {
        /**
         * 輪胎
         */
        void tire();
    }
    
    public class NormalTire implements ITire {
        @Override
        public void tire() {
            System.out.println("普通輪胎");
        }
    }
    
    public class SUVTire implements ITire {
        @Override
        public void tire() {
            System.out.println("越野輪胎");
        }
    }
    
  2. 發(fā)動機相關(guān)類

    public interface IEngine {
        /**
         * 發(fā)動機
         */
        void engine();
    }
    
    public class DomesticEngine implements IEngine {
        @Override
        public void engine() {
            System.out.println("國產(chǎn)發(fā)動機");
        }
    }
    
    public class ImportEngine implements IEngine {
        @Override
        public void engine() {
            System.out.println("進口發(fā)動機");
        }
    }
    
  3. 制動系統(tǒng)相關(guān)類

    public interface IBrake {
        void brake();
    }
    
    public class NormalBrake implements IBrake {
        @Override
        public void brake() {
            System.out.println("普通制動");
        }
    }
    
    public class SeniorBrake implements IBrake {
        @Override
        public void brake() {
            System.out.println("高級制動");
        }
    }
    
  4. 抽象車廠類

    public abstract class CarFactory {
        /**
         * 生產(chǎn)輪胎
         */
        public abstract ITire createTire();
    
        /**
         * 生產(chǎn)發(fā)動機
         */
        public abstract IEngine createEngine();
    
        /**
         * 生產(chǎn)制動系統(tǒng)
         */
        public abstract IBrake createBrake();
    }
    
  5. Q3 工廠類

    public class Q3Factory extends CarFactory {
        @Override
        public ITire createTire() {
            return new NormalTire();
        }
    
        @Override
        public IEngine createEngine() {
            return new DomesticEngine();
        }
    
        @Override
        public IBrake createBrake() {
            return new NormalBrake();
        }
    }
    
  6. Q7 工廠類

    public class Q7Factory extends CarFactory {
        @Override
        public ITire createTire() {
            return new SUVTire();
        }
    
        @Override
        public IEngine createEngine() {
            return new ImportEngine();
        }
    
        @Override
        public IBrake createBrake() {
            return new SeniorBrake();
        }
    }
    
  7. 測試

    public class Client {
        public static void main(String[] args) {
            Q3Factory factoryQ3 = new Q3Factory();
            factoryQ3.createTire().tire();
            factoryQ3.createEngine().engine();
            factoryQ3.createBrake().brake();
    
            System.out.println("-----------------");
    
            Q7Factory factoryQ7 = new Q7Factory();
            factoryQ7.createTire().tire();
            factoryQ7.createEngine().engine();
            factoryQ7.createBrake().brake();
        }
    }
    

    輸出結(jié)果如下:

    普通輪胎
    國產(chǎn)發(fā)動機
    普通制動
    -----------------
    越野輪胎
    進口發(fā)動機
    高級制動
    

這里只有Q3 和Q7 的工廠霞篡,如果需要增加Q5的工廠,那么需要增加響應(yīng)的類文件端逼,這樣會造成類文件非常多朗兵。因此,在開發(fā)中需要權(quán)衡慎用顶滩。

Android 源碼中的實現(xiàn)

相對較少余掖。Android 底層 MediaPlayer 的創(chuàng)建。

總結(jié)

  • 優(yōu)點:

    分離接口與實現(xiàn)诲祸,客戶端使用抽象工廠來創(chuàng)建需要的對象浊吏,而客戶端無需知道具體的實現(xiàn)類是哪個而昨,使其實現(xiàn)面向接口編程救氯,使得該模式在切換產(chǎn)品類時更加靈活、容易歌憨。

  • 缺點:

    1. 類文件陡增着憨;
    2. 不太容易擴展新的產(chǎn)品類,因為每當(dāng)增加一個產(chǎn)品類就需要修改工廠务嫡,那么所有的具體工廠類均會被修改甲抖。

所以其在實際開發(fā)中使用較少,了解即可心铃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末准谚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子去扣,更是在濱河造成了極大的恐慌柱衔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愉棱,死亡現(xiàn)場離奇詭異唆铐,居然都是意外死亡,警方通過查閱死者的電腦和手機奔滑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門艾岂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朋其,你說我怎么就攤上這事王浴〈嘌祝” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵叼耙,是天一觀的道長腕窥。 經(jīng)常有香客問我,道長筛婉,這世上最難降的妖魔是什么簇爆? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮爽撒,結(jié)果婚禮上入蛆,老公的妹妹穿的比我還像新娘。我一直安慰自己硕勿,他們只是感情好哨毁,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著源武,像睡著了一般扼褪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粱栖,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天话浇,我揣著相機與錄音,去河邊找鬼闹究。 笑死幔崖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渣淤。 我是一名探鬼主播赏寇,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼价认!你這毒婦竟也來了嗅定?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤用踩,失蹤者是張志新(化名)和其女友劉穎渠退,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捶箱,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡智什,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丁屎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荠锭。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晨川,靈堂內(nèi)的尸體忽然破棺而出证九,到底是詐尸還是另有隱情删豺,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布愧怜,位于F島的核電站呀页,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拥坛。R本人自食惡果不足惜蓬蝶,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猜惋。 院中可真熱鬧丸氛,春花似錦、人聲如沸著摔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谍咆。三九已至禾锤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摹察,已是汗流浹背恩掷。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留港粱,地道東北人螃成。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓旦签,卻偏偏與公主長得像查坪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宁炫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理偿曙,服務(wù)發(fā)現(xiàn),斷路器羔巢,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 面向?qū)ο蟮牧笤瓌t 單一職責(zé)原則 所謂職責(zé)是指類變化的原因望忆。如果一個類有多于一個的動機被改變,那么這個類就具有多于...
    JxMY閱讀 940評論 1 3
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應(yīng)用竿秆。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,587評論 1 114
  • 1 場景問題# 1.1 選擇組裝電腦的配件## 舉個生活中常見的例子——組裝電腦启摄,我們在組裝電腦的時候,通常需要選...
    七寸知架構(gòu)閱讀 4,335評論 6 67
  • 在這個越來越現(xiàn)實的社會,我們越來越重視金錢匪燕,為了掙錢可謂是無所不用其極蕾羊,碰瓷的喧笔,裝殘疾的,裝孕婦的等等龟再。...
    躲在墻角曬太陽閱讀 225評論 0 1