工廠模式

????此文將工廠模式和抽象工廠模式整理在一起,因靜態(tài)工廠模式涉及到"是否應該代替構造器"等很多其他的問題,故本文將靜態(tài)工廠模式單獨拿出,以后另起一篇詳細講解.
工廠模式按模式類型分為三種:
1. 簡單工廠模式
2. 工廠方法模式
3. 抽象工廠模式

1.簡單工廠模式:創(chuàng)建一個工廠類气筋,對實現(xiàn)了同一接口的一些類進行實例的創(chuàng)建.

有些說法認為簡單工廠模式僅僅只是用來創(chuàng)建對象的一個類,并不算23種設計模式之一.
請看下例:
創(chuàng)建一個共同的接口

public interface Phone {//工廠方法產生的對象,返回值全部由此接口接收
       public void call();  
} 

其次,創(chuàng)建實現(xiàn)類:

public class Ipone/* 生產蘋果手機的工廠 */ implements Phone {

    {// 我們只關心工廠是否創(chuàng)建對象,所以通過代碼塊來測試,下文不使用對象具體的功能(方法)
        System.out.println("make a Ipone!");// 生產一個蘋果手機
    }

    @Override
    public void call() {
        System.out.println("用蘋果打電話");
    }
}
public class Huawei/* 生產華為手機的工廠 */ implements Phone {

    {
        System.out.println("make a Huawei!");// 生產了一個華為手機
    }

    @Override
    public void call() {
        System.out.println("用華為打電話");
    }
}

最后,建工廠類:

public class PhoneFactory_Simple {
    public Phone producePhone(String phoneType/* 手機類型 */) {
        if ("Ipone".equals(phoneType)) {
            return new Ipone();
        } else if ("Huawei".equals(phoneType)) {
            return new Huawei();
        } else {
            System.out.println("請輸入正確的類型!");
            return null;
        }
    }
}

我們來測試下:

public class Test01 {
    public static void main(String[] args) throws Exception {
        PhoneFactory_Simple factor = new PhoneFactory_Simple();
        Phone Huawei = factor.producePhone("Huawei");
        Phone Ipone = factor.producePhone("Ipone");
        factor.producePhone("Xiaomi");
    }
}
結果:
make a Huawei!
make a Ipone!
請輸入正確的類型!
2.工廠方法模式:是對簡單工廠模式的功能的增強與解耦池磁,在簡單工廠模式中,如果傳遞的字符串出錯,則不能正確創(chuàng)建對象兽肤,而工廠方法模式是直接提供多個工廠方法套腹,直接調用方法創(chuàng)建對象,不需傳遞參數(shù),而且產品的種類沒有限制.

下面我們新建一個電腦接口:

public interface Computer {
    public void play();
}

創(chuàng)建一個Lenova實現(xiàn)類

public class Lenova implements Computer {
    {
        System.out.println("make a Lenova!");
    }

    @Override
    public void play() {
        System.out.println("用聯(lián)想玩游戲!");
    }
}

那么改寫之后的工廠類代碼如下:

public class Factory {
    public static Phone produceIpone()/* 生產蘋果 */ {
        return new Ipone();
    }
    public static Phone produceHuawei()/* 生產華為 */ {
        return new Huawei();
    }
    public static Computer produceLenova()/* 生產聯(lián)想 */ {
        return new Lenova();
    }
}

測試代碼如下:

public class Test02 {
    public static void main(String[] args) throws Exception {
        Factory factory = new Factory();
        Phone huawei = factory.produceHuawei();
        Phone ipone = factory.produceIpone();
        Computer lenova = factory.produceLenova();
    }
}
結果:
make a Huawei!
make a Ipone!
make a Lenova!
3.抽象工廠模式(Abstract Factory)

工廠方法模式有一個問題,類的創(chuàng)建依賴工廠類资铡,如果想要拓展程序电禀,必須對工廠類進行修改,這就違背了開閉原則(Open Closed Principle)笤休,從設計角度考慮尖飞,為解決此問題就需要用到抽象工廠模式,將工廠也抽象化店雅,這樣一旦需要增加新的功能政基,直接增加新的工廠類實現(xiàn)抽象工廠接口就可以了,不需要修改之前的代碼,在工廠方法模式的基礎上進一步增強了功能和解耦.
請看下例:
提供一個生產手機和一個生產電腦的接口,將工廠抽象化,需要生產商品的時候實例化相應接口建造一個工廠即可

public interface PhoneFactor {
    public Phone producePhone();
}
public interface ComputerFactor {
    public Computer produceComputer();
}

想生產什么類型的東西,只需要實現(xiàn)對應的工廠接口即可
下面我們創(chuàng)建一個生產Mac的工廠和一個生產小米的工廠,為避免文章冗余,Mac和小米的具體類就不寫了
生產Mac的工廠

public class HuaweiFactor implements PhoneFactor {
    @Override
    public Phone produce() {
        return new Huawei();
    }
}

生產小米的工廠

public class MacFactor implements ComputerFactor {
    @Override
    public Computer produceComputer() {
        return new Mac();
    }
}

測試代碼:

public class Test03 {
    public static void main(String[] args) throws Exception {
        XiaoMiFactor xiaoMiFactor = new XiaoMiFactor();
        Phone phone = xiaoMiFactor.producePhone();
        MacFactor macFactor = new MacFactor();
        Computer computer = macFactor.produceComputer();
    }
}
結果:
make a XiaoMi !
make a Mac!
總結

工廠模式適合在需要大量創(chuàng)建對象的時候使用,從簡單工廠模式到工廠方法模式,再到抽象工廠模式是一個功能擴展和解耦的過程,下面舉例說明:
1.簡單工廠模式:小作坊,只能生產某一類產品(實現(xiàn)了同一接口)且種類有限,還得你提供材料(傳入?yún)?shù)),功能有限.
2. 工廠方法模式:已經升級為大工廠,想造什么直接來選(直接調用空參方法,可根據(jù)方法名來辨識),在簡單工廠模式的基礎上功能已經有所擴展,但是工廠類還是固定的,想要生產其他產品就必須改造此工廠(繼承此工廠類增加新方法),產品與工廠之間的耦合性還是太高.
3. 抽象工廠模式:工廠是抽象的,我已經不是clearlove了,你想造什么告訴我,我先根據(jù)需求造一個工廠出來(實現(xiàn)對應的工廠接口),不用改造已存在工廠(改代碼),擴展性強,耦合性低.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末闹啦,一起剝皮案震驚了整個濱河市沮明,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窍奋,老刑警劉巖荐健,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異费变,居然都是意外死亡摧扇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門挚歧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吁峻,你說我怎么就攤上這事滑负。” “怎么了用含?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵矮慕,是天一觀的道長。 經常有香客問我啄骇,道長痴鳄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任缸夹,我火速辦了婚禮痪寻,結果婚禮上,老公的妹妹穿的比我還像新娘虽惭。我一直安慰自己橡类,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布芽唇。 她就那樣靜靜地躺著顾画,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上研侣,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天谱邪,我揣著相機與錄音,去河邊找鬼庶诡。 笑死惦银,一個胖子當著我的面吹牛,可吹牛的內容都是我干的灌砖。 我是一名探鬼主播璧函,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼基显!你這毒婦竟也來了蘸吓?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤撩幽,失蹤者是張志新(化名)和其女友劉穎库继,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窜醉,經...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宪萄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了榨惰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拜英。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琅催,靈堂內的尸體忽然破棺而出居凶,到底是詐尸還是另有隱情,我是刑警寧澤藤抡,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布侠碧,位于F島的核電站,受9級特大地震影響缠黍,放射性物質發(fā)生泄漏弄兜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一瓷式、第九天 我趴在偏房一處隱蔽的房頂上張望替饿。 院中可真熱鬧,春花似錦蒿往、人聲如沸盛垦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腾夯。三九已至颊埃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝶俱,已是汗流浹背班利。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榨呆,地道東北人罗标。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像积蜻,于是被迫代替她去往敵國和親闯割。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內容