java工廠模式

簡(jiǎn)介

工廠模式有三種:簡(jiǎn)單工廠模式测暗,工廠方法模式,抽象工廠模式奠骄,這三種都屬于工廠模式辰狡,但各有不同。

簡(jiǎn)單工廠模式

簡(jiǎn)單工廠模式屬于類的創(chuàng)建型模式,又叫做靜態(tài)工廠方法模式祈惶。通過(guò)專門定義一個(gè)類來(lái)負(fù)責(zé)創(chuàng)建其他類的實(shí)例雕旨,被創(chuàng)建的實(shí)例通常都具有共同的父類扮匠。

模式中包含的角色及其職責(zé)

1.工廠(Creator)角色:簡(jiǎn)單工廠模式的核心捧请,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類可以被外界直接調(diào)用棒搜,創(chuàng)建所需的產(chǎn)品對(duì)象疹蛉。
2.抽象(Product)角色:簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口力麸。
3.具體產(chǎn)品(Concrete Product)角色:簡(jiǎn)單工廠模式所創(chuàng)建的具體實(shí)例對(duì)象可款。
下面來(lái)看一個(gè)例子:

//先寫工廠角色
public class FruitFactory {
    /*
     * 獲得Apple類的實(shí)例(第一種寫法)
     */
    public static  Fruit getApple() {
        return new Apple();
        }
    
    /*
     * 獲得Banana類實(shí)例(第一種寫法)
     */
    public static Fruit getBanana() {
        return new Banana();
    }
         //(第二種寫法)傳入類名的字符串做判斷后產(chǎn)生對(duì)應(yīng)的實(shí)體類對(duì)象
     public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        if(type.equalsIgnoreCase("apple")) {
            return Apple.class.newInstance();
            
        } else if(type.equalsIgnoreCase("banana")) {
            return Banana.class.newInstance();
        } else {
            System.out.println("找不到相應(yīng)的實(shí)例化類");
            return null;
        }
                       //第三種寫法,傳入類名克蚂,運(yùn)用Java的反射機(jī)制生成實(shí)體類對(duì)象
            Class fruit = Class.forName(type);
            return (Fruit) fruit.newInstance(); 
        
    }
}


//再寫抽象角色(水果接口)
public interface Fruit {
    /*
     * 采集
     */
    public void get();
}
//再寫兩個(gè)具體產(chǎn)品角色實(shí)現(xiàn)抽象接口(蘋果類)
public class Apple implements Fruit{
    /*
     * 采集
     */
    public void get(){
        System.out.println("采集蘋果");
    }
}
//香蕉類
public class Banana implements Fruit{
    /*
     * 采集
     */
    public void get(){
        System.out.println("采集香蕉");
    }
}
//主類(客戶端)
public class MainClass {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        //實(shí)例化一個(gè)Apple(從工廠中獲裙刖ā)(第一種寫法)
        Fruit apple = FruitFactory.getApple();
        Fruit banana = FruitFactory.getBanana();
            apple.get();
        banana.get();   
                //(第二種寫法)   
            Fruit apple = FruitFactory.getFruit("Apple");
        Fruit banana = FruitFactory.getFruit("Banana");
        apple.get();
        banana.get();       
    }
}

運(yùn)行結(jié)果:

采集蘋果
采集香蕉

簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)

1.在這個(gè)模式中,工廠類是整個(gè)模式的關(guān)鍵所在埃叭。它包含必要的判斷邏輯摸恍,能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象赤屋。用戶在使用時(shí)可以直接根據(jù)工廠類去創(chuàng)建所需的實(shí)例立镶,而無(wú)需了解這些對(duì)象是如何創(chuàng)建以及如何組織的。有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化类早。
2.不難發(fā)現(xiàn)媚媒,<font color=red>簡(jiǎn)單工廠模式的缺點(diǎn)也正體現(xiàn)在其工廠類上,由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯涩僻,所以“高內(nèi)聚”方面做的并不好缭召。另外,當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí)逆日,可能會(huì)出現(xiàn)要求工廠類也要做相應(yīng)的修改嵌巷,擴(kuò)展性并不很好</font>。

工廠方法模式

工廠方法模式同樣屬于類的創(chuàng)建型模式又被稱為多態(tài)工廠模式 屏富。工廠方法模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口晴竞,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)品的創(chuàng)建狠半,這樣核心類成為一個(gè)抽象工廠角色噩死,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口颤难,<font color=red>這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。</font>

模式中包含的角色及其職責(zé)

1.抽象工廠(Creator)角色:工廠方法模式的核心已维,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口行嗤。

2.具體工廠( Concrete Creator)角色:具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn),負(fù)責(zé)實(shí)例化產(chǎn)品對(duì)象垛耳。

3.抽象(Product)角色:工廠方法模式所創(chuàng)建的所有對(duì)象的父類栅屏,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。

4.具體產(chǎn)品(Concrete Product)角色:工廠方法模式所創(chuàng)建的具體實(shí)例對(duì)象堂鲜。
對(duì)于簡(jiǎn)單工廠模式來(lái)說(shuō)栈雳,工廠方法模式把那個(gè)工廠又抽象化了一層,具體的實(shí)體類對(duì)象的創(chuàng)建推遲放到具體的工廠中去
看例子:

//先寫那個(gè)抽象工廠角色   工廠方法模式的核心缔莲,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口哥纫。
public interface FruitFactory {
    public Fruit getFruit();
}

//再寫具體工廠角色(要實(shí)現(xiàn)抽象工廠這個(gè)接口,蘋果工廠)  具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn)痴奏,負(fù)責(zé)實(shí)例化產(chǎn)品對(duì)象
public class AppleFactory implements FruitFactory {
    public Fruit getFruit() {
        return new Apple();
    }

}

//香蕉工廠  具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn)蛀骇,負(fù)責(zé)實(shí)例化產(chǎn)品對(duì)象

public class Banana implements Fruit{
    /*
     * 采集
     */
    public void get(){
        System.out.println("采集香蕉");
    }
}
//栗子工廠   具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn),負(fù)責(zé)實(shí)例化產(chǎn)品對(duì)象
public class PearFactory implements FruitFactory {

    public Fruit getFruit() {
        return new Pear();
    }
}

//再寫抽象角色(水果接口)  工廠方法模式所創(chuàng)建的所有對(duì)象的父類读拆,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口

public interface Fruit {
    
    public void get();
}

//再寫具體產(chǎn)品角色   (工廠方法模式所創(chuàng)建的具體實(shí)例對(duì)象)

//蘋果類
public class Apple implements Fruit{
    /*
     * 采集
     */
    public void get(){
        System.out.println("采集蘋果");
    }
}

//香蕉類

public class Banana implements Fruit{
    /*
     * 采集
     */
    public void get(){
        System.out.println("采集香蕉");
    }
}

//栗子類

public class Pear implements Fruit {

    public void get() {
        System.out.println("采集梨子");
    }

}

//主程序(客戶端)

public class MainClass {
    public static void main(String[] args) {
        //獲得AppleFactory
        FruitFactory ff = new AppleFactory();
        //通過(guò)AppleFactory來(lái)獲得Apple實(shí)例對(duì)象
        Fruit apple = ff.getFruit();
        apple.get();
        
        //獲得BananaFactory
        FruitFactory ff2 = new BananaFactory();
        Fruit banana = ff2.getFruit();
        banana.get();
        
        //獲得PearFactory
        FruitFactory ff3 = new PearFactory();
        Fruit pear = ff3.getFruit();
        pear.get();
    }
}

運(yùn)行結(jié)果:

采集蘋果
采集香蕉
采集梨子

工廠方法模式和簡(jiǎn)單工廠模式比較

1.工廠方法模式與簡(jiǎn)單工廠模式在結(jié)構(gòu)上的不同不是很明顯擅憔。<font color=red>工廠方法類的核心是一個(gè)抽象工廠類</font>,<font color=blue>而簡(jiǎn)單工廠模式把核心放在一個(gè)具體類上</font>檐晕。
2.工廠方法模式之所以有一個(gè)別名叫多態(tài)性工廠模式是因?yàn)榫唧w工廠類都有共同的接口暑诸,或者有共同的抽象父類。<font color=red>當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對(duì)象時(shí)棉姐,僅僅需要添加一個(gè)具體對(duì)象以及一個(gè)具體工廠對(duì)象屠列,原有工廠對(duì)象不需要進(jìn)行任何修改,也不需要修改客戶端</font>伞矩,很好的符合了“開放-封閉”原則笛洛。而簡(jiǎn)單工廠模式在添加新產(chǎn)品對(duì)象后不得不修改工廠方法,擴(kuò)展性不好乃坤。
3.工廠方法模式退化后可以演變成簡(jiǎn)單工廠模式苛让。

抽象工廠模式

抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最其一般性的,<font color=red>抽象工廠模式可以向客戶端提供一個(gè)接口湿诊,使得客戶端在不必指定產(chǎn)品的具體類型的情況下狱杰,能夠創(chuàng)建多個(gè)產(chǎn)品族的產(chǎn)品對(duì)象</font>。

模式中包含的角色及其職責(zé)

1.抽象工廠(Creator)角色:抽象工廠模式的核心厅须,<font color=red>包含對(duì)多個(gè)產(chǎn)品結(jié)構(gòu)的聲明</font>仿畸,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口。

2.具體工廠( Concrete Creator)角色:具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn),<font color=red>負(fù)責(zé)實(shí)例化某個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象</font>错沽。

3.抽象(Product)角色:抽象模式所創(chuàng)建的所有對(duì)象的父類簿晓,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。

4.具體產(chǎn)品(Concrete Product)角色:抽象模式所創(chuàng)建的具體實(shí)例對(duì)象
舉個(gè)栗子

//先寫抽象工廠角色
public interface FruitFactory {
    //實(shí)例化Apple
    public Fruit getApple();
    //實(shí)例化Banana
    public Fruit getBanana();
}

//再寫具體工廠角色(和工廠方法模式不同的是:這次的具體工廠角色分不同層級(jí))即不僅僅只是蘋果香蕉的區(qū)別千埃,還有南憔儿、北、溫室之分
public class NorthFruitFactory implements FruitFactory {

    public Fruit getApple() {
        return new NorthApple();
    }

    public Fruit getBanana() {
        return new NorthBanana();
    }
}

public class SouthFruitFactory implements FruitFactory {

    public Fruit getApple() {
        return new SouthApple();
    }

    public Fruit getBanana() {
        return new SouthBanana();
    }

}


public class WenshiFruitFactory implements FruitFactory {

    public Fruit getApple() {
        return new WenshiApple();
    }

    public Fruit getBanana() {
        return new WenshiBanana();
    }

}
//再寫抽象角色
public interface Fruit {
    /*
     * 采集
     */
    public void get();
}

//具體角色


public class NorthApple extends Apple {

    public void get() {
        System.out.println("采集北方蘋果");
    }

}


public class NorthBanana extends Banana {

    public void get() {
        System.out.println("采集北方香蕉");
    }

}


public class SouthApple extends Apple {

    public void get() {
        System.out.println("采集南方蘋果");
    }

}


public class SouthBanana extends Banana {

    public void get() {
        System.out.println("采集南方香蕉");
    }

}


public class WenshiApple extends Apple {

    public void get() {
        System.out.println("采集溫室蘋果");
    }

}


public class WenshiBanana extends Banana {

    public void get() {
        System.out.println("采集溫室香蕉");
    }

}

//主類

public class MainClass {
    public static void main(String[] args) {
        FruitFactory ff = new NorthFruitFactory();
        Fruit apple = ff.getApple();
        apple.get();
        
        Fruit banana = ff.getBanana();
        banana.get();
        
        FruitFactory ff2= new SouthFruitFactory();
        Fruit apple2 = ff2.getApple();
        apple2.get();
        
        Fruit banana2 = ff2.getBanana();
        banana2.get();
        
        FruitFactory ff3 = new WenshiFruitFactory();
        Fruit apple3 = ff3.getApple();
        apple3.get();
        
        Fruit banana3 = ff3.getBanana();
        banana3.get();
    }
}

運(yùn)行結(jié)果

采集北方蘋果
采集北方香蕉
采集南方蘋果
采集南方香蕉
采集溫室蘋果
采集溫室香蕉
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末放可,一起剝皮案震驚了整個(gè)濱河市谒臼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耀里,老刑警劉巖蜈缤,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異备韧,居然都是意外死亡劫樟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門织堂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奶陈,你說(shuō)我怎么就攤上這事易阳。” “怎么了吃粒?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵潦俺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我徐勃,道長(zhǎng)事示,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任僻肖,我火速辦了婚禮肖爵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臀脏。我一直安慰自己劝堪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布揉稚。 她就那樣靜靜地躺著秒啦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搀玖。 梳的紋絲不亂的頭發(fā)上余境,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼芳来。 笑死暴氏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绣张。 我是一名探鬼主播答渔,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼侥涵!你這毒婦竟也來(lái)了沼撕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芜飘,失蹤者是張志新(化名)和其女友劉穎务豺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦明,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笼沥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娶牌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奔浅。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诗良,靈堂內(nèi)的尸體忽然破棺而出汹桦,到底是詐尸還是另有隱情,我是刑警寧澤鉴裹,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布舞骆,位于F島的核電站,受9級(jí)特大地震影響径荔,放射性物質(zhì)發(fā)生泄漏督禽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一总处、第九天 我趴在偏房一處隱蔽的房頂上張望狈惫。 院中可真熱鬧,春花似錦辨泳、人聲如沸虱岂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)第岖。三九已至,卻和暖如春试溯,著一層夾襖步出監(jiān)牢的瞬間蔑滓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留键袱,地道東北人燎窘。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蹄咖,于是被迫代替她去往敵國(guó)和親褐健。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚澜汤、低耦合和單一職能的“沖突”實(shí)際上蚜迅,這兩者...
    彥幀閱讀 3,748評(píng)論 0 14
  • 一:概述 工廠模式的出現(xiàn)源于增加程序序的可擴(kuò)展性,降低耦合度俊抵。之所以叫做工廠模式谁不,是用工廠生產(chǎn)產(chǎn)品來(lái)形象的比喻代碼...
    我未曾閱讀 309評(píng)論 0 5
  • 目錄1.概念2.角色3.工廠執(zhí)行的具體流程簡(jiǎn)單工廠模式(靜態(tài)工廠方法)工廠模式抽象工廠模式4.分類5.總結(jié)6.學(xué)習(xí)...
    在挖坑的猿閱讀 743評(píng)論 0 4
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用徽诲、多...
    MinoyJet閱讀 3,948評(píng)論 1 15
  • 我曾悲傷的愛過(guò)這個(gè)世界 致紀(jì)伯倫 “我曾七次鄙視自己的靈魂: ——紀(jì)伯倫 第一次刹帕,當(dāng)它本可進(jìn)取時(shí),卻故作謙卑谎替; 第...
    孑隹閱讀 193評(píng)論 0 0