那些你要知道的設(shè)計(jì)模式之-工廠方法

1.定義

1.工廠模式是我們最常用的實(shí)例化對(duì)象模式了,是用工廠方法代替new操作的一種模式,讓類的實(shí)例化推遲到子類中進(jìn)行,屬于創(chuàng)建型模式

2.作用

  • 降低程序之間的耦合度
  • 提高擴(kuò)展性,降低修改量

3.案例

以生產(chǎn)汽車為例,定義一個(gè)ICar接口,汽車都有發(fā)動(dòng)機(jī)(Engine),和品牌(brand)提供這兩個(gè)方法,再定義兩個(gè)實(shí)現(xiàn)類寶馬和奧迪,分別對(duì)接口提供的兩個(gè)方法做不同的實(shí)現(xiàn),代碼如下

public interface ICar {

        //發(fā)動(dòng)機(jī)
        void Engine();

        //品牌
        void brand();

}

public class BMW implements ICar{

    @Override
    public void engine() {
            System.out.println("寶馬的發(fā)動(dòng)機(jī)");
    }

    @Override
    public void brand() {
        System.out.println("寶馬的品牌");
    }
}

public class Audi implements ICar {
    
    @Override
    public void engine() {
        System.out.println("奧迪的發(fā)動(dòng)機(jī)");
    }

    @Override
    public void brand() {
        System.out.println("奧迪的品牌");
    }
}

接下來(lái)定義一個(gè)汽車工廠來(lái)創(chuàng)建的汽車,汽車工廠有一個(gè)create方法根據(jù)方法的參數(shù)創(chuàng)建汽車,其參數(shù)是ICar的實(shí)現(xiàn)類,代碼如下:

//汽車工廠
public class CarFactory {

        //生產(chǎn)汽車
       public <T extends ICar> T  create(Class<T> c){
           ICar car = null;
           try {
                 //根據(jù)類名new一個(gè)類
                 car = (ICar) Class.forName(c.getName()).newInstance();
           } catch (Exception e) {
               e.printStackTrace();
           }
           return (T) car;
       }
}

OK!簡(jiǎn)單的工廠模式就實(shí)現(xiàn)完畢,讓我們開(kāi)始生產(chǎn)汽車吧~

public static void main(String[] args) {
        //new 一個(gè)工廠
        CarFactory factory = new CarFactory();
        //生產(chǎn)寶馬
        ICar car= factory.create(BMW.class);
        car.brand();
        car.engine();
         //生產(chǎn)奧迪
        ICar car2= factory.create(Audi.class);
        car2.brand();
        car2.engine();
    }

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

寶馬的品牌
寶馬的發(fā)動(dòng)機(jī)
奧迪的品牌
奧迪的發(fā)動(dòng)機(jī)


再分析一下實(shí)現(xiàn)過(guò)程:第一步把汽車的共性放到了ICar接口,第二步創(chuàng)建實(shí)現(xiàn)類,做不同的實(shí)現(xiàn)。第三步寫(xiě)一個(gè)工廠類里面有一個(gè)create方法,通過(guò)調(diào)用這個(gè)方法生產(chǎn)不同的汽車。實(shí)際上工廠模式在項(xiàng)目開(kāi)發(fā)中的使用頻率是非常高的,再說(shuō)一個(gè)升級(jí)版本多個(gè)工廠類,在做一些復(fù)雜的項(xiàng)目中,經(jīng)常會(huì)被用到

多個(gè)工廠類的抽象工廠,把工廠類的Create方法放到一個(gè)抽象類中,不同的工廠做不同的實(shí)現(xiàn),

public interface BaseCarFactory {

     ICar create();
}

奧迪汽車工廠創(chuàng)建奧迪汽車

//奧迪汽車工廠
public class AudiCarFactory implements BaseCarFactory {

    @Override
    public ICar create() {
        return new Audi();
    }
}

寶馬汽車工廠創(chuàng)建寶馬汽車

//寶馬汽車工廠
public class BMWCarFactory implements BaseCarFactory {

    @Override
    public ICar create() {
        return new BMW();
    }
}

Audi和BMW兩個(gè)類不變,Main函數(shù)修改如下,直接用具體的工廠,實(shí)例化具體的類

 public static void main(String[] args) {
        //new 一個(gè)奧迪汽車工廠,實(shí)例化奧迪
        ICar car = new AudiCarFactory().create();
        car.brand();
        car.Engine();

        ICar car2 = new BMWCarFactory().create();
        car2.brand();
        car2.Engine();
    }

打印結(jié)果和以前一樣

奧迪的品牌
奧迪的發(fā)動(dòng)機(jī)
寶馬的品牌
寶馬的發(fā)動(dòng)機(jī)


多工廠模式可使結(jié)構(gòu)更加的清晰,更易于實(shí)現(xiàn)特定的需求,適合在比較復(fù)雜的項(xiàng)目邏輯中使用,但又給擴(kuò)展性帶來(lái)了影響,因?yàn)槿绻阋獢U(kuò)展某各實(shí)現(xiàn)類,就需要修改相應(yīng)的工廠類,

4.總結(jié)

工廠方法模式將不變的部分提取出來(lái),將可變的部分留作接口,以達(dá)到最大程度上的復(fù)用。當(dāng)一個(gè)類不知道它所必須創(chuàng)建對(duì)象的類或一個(gè)類希望由子類來(lái)指定它所創(chuàng)建的對(duì)象時(shí),當(dāng)類將創(chuàng)建對(duì)象的職責(zé)委托給多個(gè)幫助子類中的某一個(gè),可以使用工廠方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容