設計模式之工廠模式

工廠模式

核心作用:實現(xiàn)創(chuàng)建者和調(diào)用者的分離

詳細分類:

  • 簡單工廠模式
  • 工廠方法模式
  • 抽象工廠模式

工廠模式滿足的OOP原則:

  • 開閉原則:一個軟件的實體應當對擴展開放,對修改關閉
  • 依賴倒轉原則:要針對接口編程,不要針對實現(xiàn)編程
  • 迪米特法則:只與你直接的朋友通信,而避免和陌生人通信

本質(zhì):實例化對象不使用new,用工廠方法代替


來一個簡單的例子

創(chuàng)建一個汽車接口

public interface Car{
    void name();
}

創(chuàng)建類

public class WuLin implements Car{
    public void name(){
        System.out.println("WuLin");
    }
}
public class Tesla implements Car{
    public void name(){
        System.out.println("Tesla");
    }
}

1. 簡單工廠模式(靜態(tài)工廠)

創(chuàng)建總工廠

/** 
 * 消費者只需要面對工廠,從工廠中調(diào)用靜態(tài)方法返回,不需要自己new
 * 但是每次新增車輛品種都需要修改工廠 
 */
public class CarFactory{
    // 方法一
    public static Car getCar(String car){
        if(car.equals("WuLin")){
            return new WuLin();
        }
        if(car.equals("Tesla")){
            return new Tesla();
        }
        return null;
    }

    // 方法二 比原來好一點,如果添加新車不用在原來方法的基礎上修改邏輯
    public static Car getWuLin(){
            return new WuLin();
    }
    public static Car getTesla(){
            return new Tesla();
    }

}

2. 工廠方法模式

創(chuàng)建工廠接口

public interface CarFactory{
   Car getCar();
}

創(chuàng)建Tesla工廠

public class TeslaFactory implements CarFactory{
    public Car getCar(){
        return new Tesla();
    }
}

創(chuàng)建WuLin工廠

public class WuLinFactory implements CarFactory{
    public Car getCar(){
        return new WuLin();
    }
}

從這可以看出工廠方法模式就是抽出總工廠接口
每個種類分別是創(chuàng)建自己的工廠實現(xiàn)工廠接口的方法(橫向擴展)
每次新增一種車輛就創(chuàng)建一個自己的工廠實現(xiàn)接口
不用修改原來的代碼, 符合開閉原則
但是每一次擴展都會多出一個擴展類(該類的工廠)

應用場景

  • SpringIOC容器創(chuàng)建管理對象就是工廠模式(sqlSessionBeanFactory)
  • 反射中Class對象的newInstance()方法
  • JDBC中的Connection對象的獲取

3. 抽象工廠模式
一個超級工廠,創(chuàng)建其他工廠的工廠

再來一個例子

創(chuàng)建兩個產(chǎn)品

public interface Phone{
    void startup();
    void shutdown();
    void callup();
    void sendSMS();
}

public interface Router{
    void startup();
    void shutdown();
    void setting();
}

創(chuàng)建兩個公司類分別實現(xiàn)兩個產(chǎn)品

// Phone
public class HuaweiPhone implements Phone{
    public void startup(){
        System.out.println("Huawei開機");
    }
    public void shutdown(){
        System.out.println("Huawei關機");
    }
    public void callup(){
        System.out.println("Huawei打電話");
    }
    public void sendSMS(){
        System.out.println("Huawei發(fā)短信");
    }

}

public class XiaomiPhone implements Phone{
    public void startup(){
        System.out.println("Xiaomi開機");
    }
    public void shutdown(){
        System.out.println("Xiaomi關機");
    }
    public void callup(){
        System.out.println("Xiaomi打電話");
    }
    public void sendSMS(){
        System.out.println("Xiaomi發(fā)短信");
    }

}

// Router
public class HuaweiRouter implements Router{
    public void startup(){
        System.out.println("Huawei開機");
    }
    public void shutdown(){
        System.out.println("Huawei關機");
    }

    public void setting(){
        System.out.println("Huawei設置");
    }
}

public class XiaomiRouter implements Router{
    public void startup(){
        System.out.println("Xiaomi開機");
    }
    public void shutdown(){
        System.out.println("Xiaomi關機");
    }
    public void setting(){
        System.out.println("Xiaomi設置");
    }


}

創(chuàng)建超級工廠

// 決定生產(chǎn)什么產(chǎn)品
public interface ProductFactory{
   // 生產(chǎn)手機
   Phone phoneProduct();

   // 生產(chǎn)路由器
   Roter routerProduct();

}

創(chuàng)建產(chǎn)品工廠(實現(xiàn)超級工廠)

// 具體實現(xiàn)
public class HuaweiFactory implements ProductFactory{
    
    public Phone phoneProduct(){
        return new HuaweiPhone();
    }

    public Router routerProduct(){
        return new HuaweiRouter();
    }
    
}

public class XiaomiFactory implements ProductFactory{
    public Phone phoneProduct(){
        return new XiaomiPhone();
    }

    public Router routerProduct(){
        return new XiaomiRouter();
    }
}

定義一個產(chǎn)品,這個產(chǎn)品有很多的品牌,
品牌都實現(xiàn)了這個產(chǎn)品需要的功能,
定義一個超級工廠,去創(chuàng)建這些品牌的工廠,
超級工廠有生產(chǎn)這些產(chǎn)品的抽象方法,交給不同品牌的工廠去生產(chǎn)各自品牌的產(chǎn)品

優(yōu)點:

  • 無需關心創(chuàng)建細節(jié)
  • 將系列產(chǎn)品統(tǒng)一到一起創(chuàng)建

缺點:

  • 擴展困難
  • 增加抽象性和理解難度

超級工廠是管理多個產(chǎn)品線的工廠(不負責產(chǎn)品),而前兩個模式是管理單個產(chǎn)品線
比如說多增加一個生產(chǎn)筆記本, 只需要在抽象工廠模式的超級工廠里增加抽象方法即可

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

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

  • 1.0 工廠模式之工廠方法模式 1.1 工廠方法模式定義 定義了一個創(chuàng)建對象的接口,但由子類決定要實例化哪個類。工...
    戴先森Davi閱讀 500評論 0 3
  • 在面向對象編程中, 最通常的方法是一個new操作符產(chǎn)生一個對象實例,new操作符就是用來構造對象實例的。但是在一些...
    聶叼叼閱讀 4,210評論 2 16
  • 1. 簡單工廠 簡單工廠模式又稱為靜態(tài)工廠模式,它屬于創(chuàng)建型模式。在簡單工廠模式中,可以根據(jù)不同的參數(shù)返回不同類的...
    落英墜露閱讀 261評論 0 1
  • 一. 工廠方法 1. 什么是工廠方法模式? 定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類...
    從你說謊閱讀 613評論 0 0
  • 記錄自己對工廠模式的理解,如有不對的地方,請大家多多包涵,幫忙指出。 作用:實現(xiàn)了創(chuàng)建者和調(diào)用者的分離。 本文主要...
    阿跳愛學習閱讀 473評論 0 1

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