2音半、Factory工廠模式

1、描述

  • 工廠模式的本質(zhì)就是用工廠方法代替new操作創(chuàng)建一種實(shí)例化對象的方式。
  • 在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯曹鸠,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象煌茬。
  • 工廠模式可分為簡單工廠模式,工廠方法模式和抽象工廠模式三類彻桃。

2.1 簡單工廠模式

  • 簡單工廠模式屬于類的創(chuàng)建型模式坛善,又叫靜態(tài)工廠方法模式。通過專門定義一個工廠類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例叛薯,被創(chuàng)建的實(shí)例通常都具有共同的父類浑吟。

2.1.1 簡單工廠模式含有3個角色

1)工廠角色(Creator)

這是簡單工廠模式的核心,它用來負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯耗溜。工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象省容。

public class CarFactory {
   public static Car creatCar(String type){
       Car car= null;
       // 這里我們通過switch來判斷抖拴,具體制作哪一個品牌的車
       switch(type){
           case "Benz":
               car= new Benz();
               break;
           case "BYD":
               car= new BYD();
               break;
           case "Bentley ":
               car= new Bentley();
               break;
           default:
               break;
       }
       return car;
   }
}
2)抽象角色(Product)

這是簡單工廠模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口腥椒。該類可以是接口阿宅,也可以是抽象類。

public interface Car{
    public void run();
}
3)具體產(chǎn)品角色(Concrete Product)

簡單工廠模式所創(chuàng)建的具體的實(shí)例對象笼蛛。

public class Benz implements Car{
    public void run(){
        System.out.println("這是Benz");
    }
}

public class BYD implements Car{
    public void run() {
        System.out.println("這是BYD");
    }
}

public class Bentley implements Car{
    public void run(){
        System.out.println("這是Bentley");
    }
} 
4)測試用例
//通過統(tǒng)一的工廠洒放,傳入不同參數(shù)調(diào)用生產(chǎn)汽車的方法去生產(chǎn)不同品牌的車
public class Client {
    public static void main(String[] args) {
        Car benz= CarFactory.creatCar("Benz");
        benz.run();

        Car byd= CarFactory.creatCar("BYD");
        byd.run();

        Car bentley = CarFactory.creatCar("Bentley");
        bentley.run();
    }
} 

2.1.2 結(jié)論

簡單工廠模式實(shí)現(xiàn)了生成產(chǎn)品類的代碼跟客戶端代碼分離,在工廠類中你可以添加所需的生成產(chǎn)品的邏輯代碼滨砍,但是問題來了往湿,優(yōu)秀的java代碼是符合“開放-封閉”原則的,也就是說對擴(kuò)展開發(fā)惋戏,對修改關(guān)閉领追,如果你要加一個產(chǎn)品類C,就要增加if-else判斷响逢,修改工廠類里面的生成產(chǎn)品的代碼绒窑。

2.2 工廠方法模式

  • 工廠方法模式是對普通工廠方法模式的改進(jìn),在普通工廠方法模式中舔亭,如果傳遞的字符串出錯些膨,則不能正確創(chuàng)建對象,而工廠方法模式是提供多個工廠方法钦铺,分別創(chuàng)建對象订雾。
  • 可以實(shí)現(xiàn)“開發(fā)-封閉”原則,無論加多少產(chǎn)品類职抡,我們都不用修改原來類中的代碼葬燎,而是通過增加工廠類來實(shí)現(xiàn)。但是這還是有缺點(diǎn)的,如果產(chǎn)品類過多谱净,我們就要生成很多的工廠類窑邦。
2.2.1. 和簡單工廠模式一樣,先定義一個接口壕探。再定義Benz冈钦、BYD和Bentley去實(shí)現(xiàn)這個接口
public interface Car{
    public void run();
}

public class Benz implements Car{
    public void run(){
        System.out.println("這是Benz");
    }
}

public class BYD implements Car{
    public void run() {
        System.out.println("這是BYD");
    }
}

public class Bentley implements Car{
    public void run(){
        System.out.println("這是Bentley");
    }
} 
2.2.2. 定義工廠接口
public interface CarFactory {
    public Car createCar();
}
2.2.3. 再分別定義BenzFactory、BYDFactory李请、BentleyFactory瞧筛,繼承剛剛定義的工廠接口
public class BenzFactory implements CarFactory {

   public Car createCar(){
       return new Benz();
   }
}

public class BYDFactory implements CarFactory {

   public Car createCar(){
       return new BYD();
   }
}

public class BentleyFactory implements CarFactory {

   public Car createCar() {
       return new Bentley();
   }
} 
2.2.4. 測試用例
// 客戶端代碼
public class Client {
    public static void main(String[] args) {
        //生產(chǎn)Benz
        CarFactory benzFactory= new BenzFactory();
        Car benz= benzFactory.createCar();
        benz.run();

        //生產(chǎn)BYD
        CarFactory bydFactory = new BYDFactory();
        Car byd= bydFactory.createCar();
        byd.run();

        //生產(chǎn)Bently
        CarFactory bentleyFactory = new BentleyFactory();
        Car bentley= bentleyFactory.createCar();
        bentley.run();
    }
} 

2.3 抽象工廠模式

  • 假如我們要實(shí)現(xiàn)的產(chǎn)品接口不止一個,也就是有多個產(chǎn)品接口导盅,不同產(chǎn)品接口有對應(yīng)的產(chǎn)品族较幌。什么是產(chǎn)品族呢?簡單的理解就是白翻,不同牌子產(chǎn)的車?yán)锩鏁信苘囶愋驼彝ヮ愋停逃妙愋偷鹊能嚶蒜桑煌谱拥能嚨呐苘囶愋偷能嚳梢越M成一個產(chǎn)品族岛琼。對于這種情況我們可以采用抽象工廠模式。
    抽象工廠模式中包含的角色及職責(zé):
1.抽象工廠角色(Creator)

這是抽象工廠模式的核心巢株,任何工廠類必須實(shí)現(xiàn)這個接口槐瑞。
1.1 定義工廠接口

public interface CarFactory {

    public SUVCar createSUVCar();

    public SportsCar createSportsCar();
}
2.具體工廠角色(Concrete Creator)

2.1它是抽象工廠的一個實(shí)現(xiàn),負(fù)責(zé)實(shí)例化產(chǎn)品對象阁苞。
定義三個工廠類繼承上邊的接口并實(shí)現(xiàn)其方法

public class BenzFactory implements CarFactory {
    public SUVCar createSUVCar(){
        return new SUVBenz();
    }
    public SportsCar createSportsCar(){
        return new SportsBenz();
    }
} 

public class BYDFactory implements CarFactory {
    public SUVCar createSUVCar(){
        return new SUVBYD();
    }
    public SportsCar createSportsCar(){
        return new SportsBYD();
    }
} 

public class BentleyFactory implements CarFactory {
    public SUVCar createSUVCar(){
        return new SUVBentley();
    }
    public SportsCar createSportsCar(){
        return new SportsBentley();
    }
} 
3.抽象角色(Product)

抽象工廠模式所創(chuàng)建的所有對象的父類困檩,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
3.1 不同型號的汽車

public interface SUVCar {

    public void run();

}

public interface SportsCar {

    public void run();

}
4.具體產(chǎn)品角色(Concrete Product)

抽象工廠模式所創(chuàng)建的具體的實(shí)例對象猬错。
4.1 定義各個型號的汽車窗看,繼承剛剛定義的接口,實(shí)現(xiàn)其方法

public class SUVBenz implements SUVCar {
    public void run() {
        System.out.println("這是SUVBenz");
    }
}

public class SportsBenz implements SportsCar {
    public void run() {
        System.out.println("這是SportsBenz");
    }
} 
public class SUVBYD implements SUVCar {
    public void run() {
        System.out.println("這是SUVBYD ");
    }
}

public class SportsBYD implements SportsCar {
    public void run() {
        System.out.println("這是SportsBYD ");
    }
} 
public class SUVBentley implements SUVCar {
    public void run() {
        System.out.println("這是SUVBentley ");
    }
}

public class SportsBentley  implements SportsCar {
    public void run() {
        System.out.println("這是SportsBentley  ");
    }
} 
5. 測試用例
public class Client {
    public static void main(String[] args) {
        //生產(chǎn)Benz
        CarFactory benzFactory = new BenzFactory();
        SUVCar suvBenz= benzFactory .createSUVCar();
        SportsCar sportsBenz = benzFactory .createSportsCar();
        suvBenz.run();
        sportsBenz.run();
        //生產(chǎn)BYD 
        CarFactory bydFactory = new BYDFactory();
        SUVCar suvBYD = bydFactory.createSUVCar();
        SportsCar sportsBYD  = bydFactory.createSportsCar();
        suvBYD.run();
        sportsBYD.run();
         //生產(chǎn)Bentley 
        CarFactory bentleyFactory = new BentleyFactory();
        SUVCar suvBentley= bentleyFactory .createSUVCar();
        SportsCar sportsBentley  = bentleyFactory .createSportsCar();
        suvBentley.run();
        sportsBentley.run();
    }
} 
6. 結(jié)論
  • 簡單工廠模式:工廠類是整個模式的關(guān)鍵所在倦炒,包含了必要的邏輯判斷显沈,能夠外界給定的信息, 決定究竟創(chuàng)建哪個具體類的對象逢唤。
  • 工廠方法模式:是對簡單工廠方法模式的一個抽象拉讯,抽離出了一個Factory類(或者接口),這個接口不負(fù)責(zé)具體產(chǎn)品的生產(chǎn)鳖藕,而只是指定一些規(guī)范魔慷,具體的生產(chǎn)工作由其子類去完成。這個模式中著恩,工廠類和產(chǎn)品類往往是一一對應(yīng)的院尔,完全解決了簡單工廠模式中違背“開閉原則”的問題蜻展,實(shí)現(xiàn)了可擴(kuò)展;
  • 抽象工廠模式 :存在多個抽象產(chǎn)品類邀摆,每個抽象產(chǎn)品類可以派生出多個具體產(chǎn)品類纵顾,工廠提供多種方法,去生產(chǎn)“系列”產(chǎn)品栋盹。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末施逾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子例获,更是在濱河造成了極大的恐慌汉额,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榨汤,死亡現(xiàn)場離奇詭異蠕搜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)收壕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門讥脐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啼器,你說我怎么就攤上這事【闫迹” “怎么了端壳?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枪蘑。 經(jīng)常有香客問我损谦,道長,這世上最難降的妖魔是什么岳颇? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任照捡,我火速辦了婚禮,結(jié)果婚禮上话侧,老公的妹妹穿的比我還像新娘栗精。我一直安慰自己,他們只是感情好瞻鹏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布悲立。 她就那樣靜靜地躺著,像睡著了一般新博。 火紅的嫁衣襯著肌膚如雪薪夕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天赫悄,我揣著相機(jī)與錄音原献,去河邊找鬼馏慨。 笑死,一個胖子當(dāng)著我的面吹牛姑隅,可吹牛的內(nèi)容都是我干的写隶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼粤策,長吁一口氣:“原來是場噩夢啊……” “哼樟澜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叮盘,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤秩贰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柔吼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毒费,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年愈魏,在試婚紗的時候發(fā)現(xiàn)自己被綠了觅玻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡培漏,死狀恐怖溪厘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牌柄,我是刑警寧澤畸悬,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站珊佣,受9級特大地震影響蹋宦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咒锻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一冷冗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惑艇,春花似錦蒿辙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兢卵,卻和暖如春习瑰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秽荤。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工甜奄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柠横,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓课兄,卻偏偏與公主長得像牍氛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烟阐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345