Android 工廠方法模式

源碼地址

使用場景

當(dāng)需要創(chuàng)建復(fù)雜對象時办陷,適合使用工廠模式。

4大模塊

  1. 抽象工廠類炸枣,是工廠方法模式的核心虏等;
  2. 具體工廠類,實現(xiàn)了具體的業(yè)務(wù)邏輯适肠;
  3. 抽象產(chǎn)品類霍衫,是所創(chuàng)建產(chǎn)品的父類;
  4. 具體產(chǎn)品類侯养,是實現(xiàn)抽象產(chǎn)品的具體產(chǎn)品對象敦跌。

示例

  1. 抽象產(chǎn)品類

    public abstract class Product {
        /**
         * 產(chǎn)品類的抽象方法,由具體的產(chǎn)品類實現(xiàn)
         */
        public abstract void method();
    }
    
  2. 具體產(chǎn)品類 A

    public class ConcreteProductA extends Product {
        @Override
        public void method() {
            System.out.println("我是具體的產(chǎn)品A");
        }
    }
    
  3. 具體產(chǎn)品類 B

    public class ConcreteProductB extends Product {
        @Override
        public void method() {
            System.out.println("我是具體的產(chǎn)品B");
        }
    }
    
  4. 抽象工廠類(第一種方式)

    public abstract class Factory {
        /**
         * 抽象工廠方法
         * 具體生產(chǎn)什么由子類實現(xiàn)
         */
        public abstract Product createProduct();
    }
    
  5. 具體工廠類(通過 new 的方式創(chuàng)建)

    public class ConcreteFactory extends Factory {
        @Override
        public Product createProduct() {
            return new ConcreteProductA();
    //        return new ConcreteProductB();
        }
    }
    
  6. 客戶類

    public class Client {
        public static void main(String[] args) {
            Factory factory = new ConcreteFactory();
            Product product = factory.createProduct();
            product.method();
    
            //Factory2 factory2 = new ConcreteFactory2();
            //ConcreteProductB product2 = factory2.createProduct(ConcreteProductB.class);
            //product2.method();
        }
    }
    
  7. 抽象工廠類(第二種方式)

    public abstract class Factory2 {
        /**
         * 抽象工廠方法
         * @param clz   產(chǎn)品對象類類型
         * @return  具體的產(chǎn)品對象
         */
        public abstract <T extends Product> T createProduct(Class<T> clz);
    }
    
  8. 具體工廠類(通過反射的方式創(chuàng)建)

    public class ConcreteFactory2 extends Factory2 {
        @Override
        public <T extends Product> T createProduct(Class<T> clz) {
            Product product = null;
            try {
                product = ((Product) Class.forName(clz.getName()).newInstance());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return (T) product;
        }
    }
    

簡單工廠模式 / 靜態(tài)工廠模式:去掉抽象工廠類沸毁。

public class Factory {
    public static Product createProduct() {
        return new ConcreteProductA()
        //return new ConcreteProductB()
    }
}

簡單實現(xiàn)

說明:小明的汽車廠需要組裝某款車峰髓,如Q3傻寂、Q5、Q7携兵,具體代碼如下:

  1. 抽象車型

    public abstract class AudiCar {
        /**
         * 汽車啟動
         */
        public abstract void drive();
    
        /**
         * 汽車自動巡航
         */
        public abstract void selfNavigation();
    }
    
  2. 具體車型 Q3

    public class AudiQ3 extends AudiCar {
        @Override
        public void drive() {
            System.out.println(" Q3 起飛~~~ ");
        }
    
        @Override
        public void selfNavigation() {
            System.out.println(" Q3 開始自動巡航~~~ ");
        }
    }
    
  3. 具體車型 Q5

    public class AudiQ5 extends AudiCar {
        @Override
        public void drive() {
            System.out.println(" Q5 起飛~~~ ");
        }
    
        @Override
        public void selfNavigation() {
            System.out.println(" Q5 開始自動巡航~~~ ");
        }
    }
    
  4. 具體車型 Q7

    public class AudiQ7 extends AudiCar {
        @Override
        public void drive() {
            System.out.println(" Q7 起飛~~~ ");
        }
    
        @Override
        public void selfNavigation() {
            System.out.println(" Q7 開始自動巡航~~~ ");
        }
    }
    
  5. 抽象工廠

    public abstract class AudiFactory {
        /**
         * 生產(chǎn)車
         * @param clz   具體型號類型
         * @return  具體型號車對象
         */
        public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
    }
    
  6. 具體生產(chǎn)工廠

    public class AudiCarFactory extends AudiFactory {
        @Override
        public <T extends AudiCar> T createAudiCar(Class<T> clz) {
            AudiCar car = null;
            try {
                car = ((AudiCar) Class.forName(clz.getName()).newInstance());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return (T) car;
        }
    }
    
  7. 流水線(客戶類)

    public class Client {
        public static void main(String[] args) {
            //構(gòu)造一個制造汽車的工廠對象
            AudiFactory factory = new AudiCarFactory();
            //生產(chǎn) Q3 并啟動
            AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class);
            audiQ3.drive();
            audiQ3.selfNavigation();
            //生產(chǎn) Q5 并啟動
            AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
            audiQ5.drive();
            audiQ5.selfNavigation();
            //生產(chǎn) Q7 并啟動
            AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class);
            audiQ7.drive();
            audiQ7.selfNavigation();
        }
    }
    

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

ArrayList 中創(chuàng)建 Iterator 對象疾掰;Activity 中 onCreate 方法 setContentView 創(chuàng)建布局對象。

總結(jié)

  • 優(yōu)點

    使用簡單徐紧,依賴于抽象的架構(gòu)静檬,擴展性好。

  • 缺點

    每次添加新的產(chǎn)品時就要編寫一個新的產(chǎn)品類并级,同時需要引入抽象層拂檩,會使得類結(jié)構(gòu)復(fù)雜化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘲碧,一起剝皮案震驚了整個濱河市稻励,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愈涩,老刑警劉巖望抽,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異履婉,居然都是意外死亡煤篙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門毁腿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辑奈,“玉大人,你說我怎么就攤上這事已烤○埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵草戈,是天一觀的道長塌鸯。 經(jīng)常有香客問我侍瑟,道長唐片,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任涨颜,我火速辦了婚禮费韭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庭瑰。我一直安慰自己星持,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布弹灭。 她就那樣靜靜地躺著督暂,像睡著了一般揪垄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逻翁,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天饥努,我揣著相機與錄音,去河邊找鬼八回。 笑死酷愧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缠诅。 我是一名探鬼主播溶浴,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼管引!你這毒婦竟也來了士败?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤褥伴,失蹤者是張志新(化名)和其女友劉穎拱烁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體噩翠,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡戏自,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伤锚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擅笔。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屯援,靈堂內(nèi)的尸體忽然破棺而出猛们,到底是詐尸還是另有隱情,我是刑警寧澤狞洋,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布弯淘,位于F島的核電站,受9級特大地震影響吉懊,放射性物質(zhì)發(fā)生泄漏庐橙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一借嗽、第九天 我趴在偏房一處隱蔽的房頂上張望态鳖。 院中可真熱鬧,春花似錦恶导、人聲如沸浆竭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邦泄。三九已至删窒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顺囊,已是汗流浹背易稠。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留包蓝,地道東北人驶社。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像测萎,于是被迫代替她去往敵國和親亡电。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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