設(shè)計(jì)模式——工廠設(shè)計(jì)模式

什么是工廠設(shè)計(jì)模式?

工廠設(shè)計(jì)模式,顧名思義,就是用來(lái)生產(chǎn)對(duì)象的,在java中,萬(wàn)物皆對(duì)象,這些對(duì)象都需要?jiǎng)?chuàng)建,如果創(chuàng)建的時(shí)候直接new該對(duì)象,就會(huì)對(duì)該對(duì)象耦合嚴(yán)重,假如我們要更換對(duì)象,所有new對(duì)象的地方都需要修改一遍,這顯然違背了軟件設(shè)計(jì)的開(kāi)閉原則,如果我們使用工廠來(lái)生產(chǎn)對(duì)象,我們就只和工廠打交道就可以了,徹底和對(duì)象解耦,如果要更換對(duì)象,直接在工廠里更換該對(duì)象即可,達(dá)到了與對(duì)象解耦的目的;所以說(shuō),工廠模式最大的優(yōu)點(diǎn)就是:解耦

簡(jiǎn)單工廠模式(靜態(tài)工廠模式)

  1. 簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式,是工廠模式的一種。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式
  2. 簡(jiǎn)單工廠模式:定義了一個(gè)創(chuàng)建對(duì)象的類,由這個(gè)類來(lái)封裝實(shí)例化對(duì)象的行為(代碼)
  3. 在軟件開(kāi)發(fā)中,當(dāng)我們會(huì)用到大量的創(chuàng)建某種、某類或者某批對(duì)象時(shí),就會(huì)使用到工廠模式.

◆雖然某種程度上不符合設(shè)計(jì)原則,但實(shí)際使用最多!

我有一個(gè)汽車工廠,可以生產(chǎn)各種汽車對(duì)象

public class CarFactory {
    public  static Car GetCar(String car){
        if(car.equals("寶馬")){
            return new BaoMa();
        }else if(car.equals("奔馳")){
            return new BenChi();
        }else{
            return null;
        }
    }
}

汽車生產(chǎn)接口

public interface  Car {
     void  name();
}

具體類 寶馬 實(shí)現(xiàn)接口

public class BaoMa  implements  Car {
    @Override
    public void name() {
        System.out.println("寶馬");
    }
}

具體類 奔馳 實(shí)現(xiàn)接口

public class BenChi implements  Car {
    @Override
    public void name() {
        System.out.println("奔馳");
    }
}

使用

        Car car=CarFactory.GetCar("寶馬");
        Car car1=CarFactory.GetCar("奔馳");
        car1.name();
        car.name();

但是這時(shí),我想要獲得獲得其他汽車對(duì)象,我就得修改汽車工廠,這就違背了設(shè)計(jì)模式的開(kāi)閉原則。
開(kāi)放-關(guān)閉原則表示軟件實(shí)體 (類、模塊、函數(shù)等等) 應(yīng)該是可以被擴(kuò)展的,但是不可被修改

工廠方法模式

  • 介紹:
    定義了一個(gè)創(chuàng)建對(duì)象的抽象方法,由子類決定要實(shí)例化的類。工廠方法模式將對(duì)象的實(shí)例化推遲到子類。
  • 適用場(chǎng)景:
    消費(fèi)者不關(guān)心它所要?jiǎng)?chuàng)建對(duì)象的類(產(chǎn)品類)的時(shí)候。
    消費(fèi)者知道它所要?jiǎng)?chuàng)建對(duì)象的類(產(chǎn)品類),但不關(guān)心如何創(chuàng)建的時(shí)候。

◆不修改已有類的前提下,通過(guò)增加新的工廠類實(shí)現(xiàn)擴(kuò)展,

工廠接口:

public interface CarFactory {
  Car getCar();
}

寶馬工廠

public class BaoMaFactory implements  CarFactory {
    @Override
    public Car getCar() {
        return new BaoMa();
    }
}

奔馳工廠

public class BenChiFactory implements  CarFactory {
    @Override
    public Car getCar() {
        return new BenChi();
    }
}

使用:

        Car car=new BaoMaFactory().getCar();
        Car car1=new BenChiFactory().getCar();

        car1.name();    //奔馳
        car.name();     //寶馬

抽象工廠模式

  • 介紹:
  1. 抽象工廠模式:定義了一個(gè) interface 用于創(chuàng)建相關(guān)或有依賴關(guān)系的對(duì)象簇,而無(wú)需指明具體的類
  2. 抽象工廠模式可以將簡(jiǎn)單工廠模式和工廠方法模式進(jìn)行整合。
  3. 從設(shè)計(jì)層面看,抽象工廠模式就是對(duì)簡(jiǎn)單工廠模式的改進(jìn)(或者稱為進(jìn)一步的抽象)。
  4. 將工廠抽象成兩層,AbsFactory(抽象工廠) 和 具體實(shí)現(xiàn)的工廠子類。程序員可以根據(jù)創(chuàng)建對(duì)象類型使用對(duì)應(yīng)的工廠子類。這樣將單個(gè)的簡(jiǎn)單工廠類變成了工廠簇,更利于代碼的維護(hù)和擴(kuò)展。
  • 適用場(chǎng)景
    1、客戶端(應(yīng)用層)不依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、實(shí)現(xiàn)等細(xì)節(jié)
    2、強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象(屬于同一產(chǎn)品族)一起使用創(chuàng)建對(duì)象需要大量重復(fù)的代碼
    3、提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)
image.png

◆不可以增加產(chǎn)品,可以增加產(chǎn)品族!

image.png
//工廠接口
public interface IProductFactory {
    //生產(chǎn)手機(jī)
    IphoneProduct iphoneproduct();
    //生產(chǎn)路由器
    IrouterProject irouterproject();
}

//華為工廠
public class HuaweiFactory  implements IProductFactory {
    @Override
    public IphoneProduct iphoneproduct() {
        return new HuaweiPhone();
    }

    @Override
    public IrouterProject irouterproject() {
        return new HuaweiRouter();
    }
}
//小米工廠
public class XiaomiFactory implements IProductFactory {
    @Override
    public IphoneProduct iphoneproduct() {
        return new XiaomiPhone();
    }

    @Override
    public IrouterProject irouterproject() {
        return new XiaomiRouter();
    }
}

//手機(jī)接口
public interface IphoneProduct {
    void start();
    void shutdown();
    void callup();
    void sendSMS();
}
//華為手機(jī)
public class HuaweiPhone implements IphoneProduct {
    @Override
    public void start() {
        System.out.println("開(kāi)啟華為手機(jī)");
    }

    @Override
    public void shutdown() {
        System.out.println("關(guān)閉華為手機(jī)");
    }

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

    @Override
    public void sendSMS() {
        System.out.println("華為發(fā)信息");
    }
}
//小米手機(jī)
public class XiaomiPhone implements IphoneProduct {
    @Override
    public void start() {
        System.out.println("開(kāi)啟小米手機(jī)");
    }

    @Override
    public void shutdown() {
        System.out.println("關(guān)閉小米手機(jī)");
    }

    @Override
    public void callup() {
        System.out.println("小米打電話");
    }

    @Override
    public void sendSMS() {
        System.out.println("小米發(fā)信息");
    }
}

//路由器接口
public interface IrouterProject {
    void start();
    void shutdown();
    void openWife();
    void setting();
}
//華為路由
public class HuaweiRouter implements IrouterProject {
    @Override
    public void start() {
        System.out.println("開(kāi)啟華為路由器");
    }
    @Override
    public void shutdown() {
        System.out.println("關(guān)閉華為路由器");
    }
    @Override
    public void openWife() {
        System.out.println("打開(kāi)華為wifi");
    }
    @Override
    public void setting() {
        System.out.println("華為設(shè)置");
    }
}
//小米路由
public class XiaomiRouter implements IrouterProject {
    @Override
    public void start() {
        System.out.println("開(kāi)啟小米路由器");
    }
    @Override
    public void shutdown() {
        System.out.println("關(guān)閉小米路由器");
    }
    @Override
    public void openWife() {
        System.out.println("打開(kāi)小米 wifi");
    }
    @Override
    public void setting() {
        System.out.println("小米設(shè)置");
    }
}

抽象工廠可以解決一系列的產(chǎn)品生產(chǎn)的需求,對(duì)于大批量,多系列的產(chǎn)品,用抽象工廠可以更好的管理和擴(kuò)展;

三種工廠方式總結(jié):

1、對(duì)于簡(jiǎn)單工廠和工廠方法來(lái)說(shuō),兩者的使用方式實(shí)際上是一樣的,如果對(duì)于產(chǎn)品的分類和名稱是確定的,數(shù)量是相對(duì)固定的,推薦使用簡(jiǎn)單工廠模式;
2、抽象工廠用來(lái)解決相對(duì)復(fù)雜的問(wèn)題,適用于一系列、大批量的對(duì)象生產(chǎn);

應(yīng)用場(chǎng)景:

◆JDK中Calendar的getlnstance方法(簡(jiǎn)單工廠模式)
◆JDBC中的Connection對(duì)象的獲取
◆Spring中IOC容器創(chuàng)建管理bean對(duì)象.反射中Class對(duì)象的newInstance方法

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 175,951評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,796評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,566評(píng)論 6 407
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,055評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,303評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,683評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,899評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,135評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,520評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,757評(píng)論 1 282
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,528評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,844評(píng)論 2 372

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