<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網

      掃一掃關注

      當前位置: 首頁 » 企資快訊 » 辦公 » 正文

      略懂設計模式之工廠模式

      放大字體  縮小字體 發布日期:2021-09-04 09:43:37    作者:王恒    瀏覽次數:23
      導讀

      前言工廠模式應該是大家的老朋友了,相信很多朋友在學習和工作中一定遇到過,但是不一定很了解,這篇文章將通過幾個例子,帶大家一起進一步了解工廠模式。簡介工廠模式(Factory Pattern)是 Java 中最常用的設計模

      前言


      工廠模式應該是大家的老朋友了,相信很多朋友在學習和工作中一定遇到過,但是不一定很了解,這篇文章將通過幾個例子,帶大家一起進一步了解工廠模式。


      簡介


      工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。 這種類型的設計模式屬于創建型模式 ,它提供了一種創建對象的最佳方式。

      在創建型模式中工廠模式是比較重要的一種,之所以名稱中包含“工廠”二字,是因為用工廠代替了 new 操作,將對象實例化的過程交給工廠來實現。

      工廠模式關心的是最終創建的對象, 而不關心創建的過程。 舉個例子,好比您需要一輛汽車,可以直接從工廠里面提貨,而不用去管這輛汽車是怎么做出來的,以及這個汽車里面的具體實現。

      工廠模式可以分為三類:

    • 簡單工廠模式 (Simple Factory)
    • 工廠方法模式 (Factory Method)
    • 抽象工廠模式 (Abstract Factory)

      其中簡單工廠模式并不屬于23種 GOF 設計模式之一,而是將其看作工廠方法模式的一種特例,兩者歸為一類。


      簡單工廠模式


      簡單工廠模式又叫靜態工廠模式,由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(繼承自一個父類或接口)的實例。

      簡單工廠模式的主要組成:

      工廠(Factory): 負責實現創建所有實例的內部邏輯,并提供一個外界調用的方法,創建所需的產品對象

      抽象產品(Product): 負責描述產品的公共接口

      具體產品(ConcreteProduct): 描述生產的具體產品

      這里我們就以生產汽車為例:


      首先定義產品,先想好要生產什么:

      // 汽車基類public abstract class Car {    // 輸出汽車信息    public abstract void printInfo();}// 比亞迪汽車public class BydCar extends Car{    @Override    public void printInfo() {        System.out.println("這是比亞迪汽車");    }}// 吉利汽車public class GeelyCar extends Car{    @Override    public void printInfo() {        System.out.println("這是吉利汽車");    }}

      然后定義工廠類,想好生產什么產品之后,就要建工廠了:

      // 汽車工廠類public class CarFactory {    // 生產汽車    public static Car productionCar(String brand) {        if ("geely".equals(brand)) {            return new GeelyCar();        } else if ("byd".equals(brand)) {            return new BydCar();        } else {            return null;        }    }}

      工廠建好了,有了比亞迪和吉利兩條生產線,就可以大膽生產汽車了:

      public class FactoryPatternDemo {    public static void main(String[] args) {        Car car = CarFactory.productionCar("byd");        car.printInfo();    }}// 輸出:這是比亞迪汽是不是很簡單,這時候可能有朋友就要問了,那我想要紅旗汽車怎么辦,還得再創建一個紅旗汽車類,然后修改工廠類的判斷邏輯,顯然這是違背開閉原則的。

      是不是很簡單,這時候可能有朋友就要問了,那我想要紅旗汽車怎么辦,還得再創建一個紅旗汽車類,然后修改工廠類的判斷邏輯,顯然這是違背開閉原則的。

      那么可不可以不修改工廠類里的邏輯呢?

      當然可以,還有一種方式是通過反射來創建具體的產品,我們熟悉的 Spring 的 BeanFactory 就是采用反射的方式實現的。

      還是汽車工廠類,我們修改一下代碼:

      public class CarFactory {    public static Car productionCar(Class c){        Car car = null;        try {            car = (Car) Class.forName(c.getName()).newInstance();        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return car;    }}

      反射的方式看起來代碼簡潔多了是吧,但是某些情況下并不合適,而且反射對程序性能也會有影響。

      簡單工廠模式適用于業務簡單的情況下,而對于復雜的業務環境可能就不太適用了。這個時候就要工廠方法模式登場了。


      工廠方法模式


      在簡單工廠模式中,工廠負責所有產品的生產,就像上面例子中,一個汽車工廠負責所有汽車的生產。而工廠方法模式則是將工廠類抽象化,把生成具體產品的任務分發給繼承抽象方法的具體的產品工廠。

      工廠方法模式的主要組成:

      抽象工廠(Abstract Factory):描述具體工廠的公共接口

      具體工廠(ConcreteFactory):描述具體工廠,創建產品的實例,供外界調用

      抽象產品(Product):負責描述產品的公共接口

      具體產品(ConcreteProduct):描述生產的具體產品

      我們還是以生產汽車為例:


      將簡單工廠方法中的工廠類改為抽象工廠類,再創建具體工廠類來實現汽車的生產工作:

      // 抽象汽車工廠類public abstract class AbstractCarFactory {    // 生產汽車    abstract Car productionCar();}// 比亞迪汽車工廠public class BydCarFactory extends AbstractCarFactory{    @Override    Car productionCar()        return new BydCar();    }}// 吉利汽車工廠public class GeelyCarFactory extends AbstractCarFactory{    @Override    Car productionCar()        return new GeelyCar();    }}

      這下要生產什么品牌的汽車,就要交給具體的工廠了:

      public class FactoryPatternDemo {    public static void main(String[] args) {        AbstractCarFactory factory = new BydCarFactory();        Car car = factory.productionCar();        car.printInfo();    }}// 輸出:這是比亞迪汽車

      工廠方法模式看起來要比簡單工廠模式更復雜一些,每增加一個新的產品就要增加一個工廠,但是他提高了系統的可擴展性和可維護性,完全符合開閉原則。

      我們可能遇到的大部分業務需求使用工廠方法模式足以應付,但是凡事都有特殊情況。當產品種類更加復雜,存在產品族的時候,就要使用抽象工廠模式了。


      抽象工廠模式


      在介紹抽象工廠模式前,我們先了解下產品族是什么:位于不同產品等級結構中,功能相關聯的產品組成的家族。

      沒有理解的話可以看下圖:


      圖中,比亞迪的商務汽車和吉利的商務汽車都屬于商務車產品族,運動車產品族同理。

      抽象工廠模式提供了一種方式,可以將同一產品族的單獨的工廠封裝起來。它是三種工廠模式里面最為抽象、最具一般性的。

      抽象工廠模式和工廠方法模式一樣,都符合開閉原則。但是不同的是,工廠方法模式在增加一個具體產品的時候,都要增加對應的工廠。但是抽象工廠模式只有在新增一個類型的具體產品時才需要新增工廠。也就是說,工廠方法模式的一個工廠只能創建一個具體產品。而抽象工廠模式的一個工廠可以創建屬于一類類型的多種具體產品。工廠創建產品的個數介于簡單工廠模式和工廠方法模式之間。

      抽象工廠模式的主要組成:

      抽象工廠(AbstractFactory):描述具體工廠的公共接口

      具體工廠(ConcreteFactory):描述具體工廠,創建產品的實例,供外界調用

      抽象產品(族)(AbstractProduct):描述抽象產品的公共接口

      具體產品(ConcreteProduct):描述具體產品的公共接口

      同樣以生產汽車為例:


      創建商務汽車產品族和運動汽車產品族相關類:

      // 商務汽車抽象類public abstract class BusinessCar {    public abstract void printInfo();}// 比亞迪商務汽車public class BydBusinessCar extends BusinessCar{    @Override    public void printInfo() {        System.out.println("這是比亞迪商務汽車");    }}// 吉利商務汽車public class GeelyBusinessCar extends BusinessCar{    @Override    public void printInfo(){        System.out.println("這是吉利商務汽車");    }}// 運動汽車抽象類public abstract class SportCar {    public abstract void printInfo();}// 比亞迪運動汽車public class BydSportCar extends SportCar{    @Override    public void printInfo() {        System.out.println("這是比亞迪運動汽車");    }}// 吉利運動汽車public class GeelySportCar extends SportCar{    @Override    public void printInfo(){        System.out.println("這是吉利運動汽車");    }}

      創建抽象工廠類和具體工廠類:

      // 抽象汽車工廠類public abstract class AbstractCarFactory {    // 生產商務汽車    abstract BusinessCar productionBusinessCar();    // 生產運動汽車    abstract SportCar productionSportCar();}// 比亞迪汽車工廠public class BydCarFactory extends AbstractCarFactory{    @Override    public BusinessCar productionBusiness() {        return new BydBusinessCar();    }        @Override    public SportCar productionSport() {        return new BydSportCar();    }}// 吉利汽車工廠public class GeelyCarFactory extends AbstractCarFactory{    @Override    public BusinessCar productionBusiness() {        return new GeelyBusinessCar();    }        @Override    public SportCar productionSport() {        return new GeelySportCar();    }}

      開始生產汽車:

      public class FactoryPatternDemo {    public static void main(String[] args) {        AbstractCarFactory factory = new BydCarFactory();        BusinessCar car = factory.BydBusinessCar();        car.printInfo();    }}// 輸出:這是比亞迪商務汽車

      抽象工廠模式除了具有工廠方法模式的優點外,最主要的優點就是可以在類的內部對產品族進行約束。但是產品族的擴展將是一件十分費力的事情,假如產品族中需要增加一個新的產品,則幾乎所有的工廠類都需要進行修改,不能很好地支持開閉原則。所以使用抽象工廠模式時,對產品等級結構的劃分是非常重要的。


      總結


      三種工廠模式都各有優缺點,合適的才是最好的,希望大家能夠理解并靈活運用,讓自己的代碼變得更優雅!

    •  
      (文/王恒)
      免責聲明
      本文僅代表作發布者:王恒個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
       

      Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

      粵ICP備16078936號

      微信

      關注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯系
      客服

      聯系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號: weishitui

      客服001 客服002 客服003

      工作時間:

      周一至周五: 09:00 - 18:00

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 无码一区二区波多野结衣播放搜索| 翘臀少妇被扒开屁股日出水爆乳 | 黑人解禁濑亚美莉| 欧美日韩**字幕一区| 国产超碰人人模人人爽人人喊| 亚洲欧美日韩人成| 91最新高端约会系列178| 欧美色图在线播放| 国产精品视频永久免费播放| 亚洲最大在线视频| 18禁裸男晨勃露j毛免费观看 | 小小视频在线版观看| 公和熄三级中字电影久久| xxxxx日韩| 激情综合色五月六月婷婷| 在私人影院里嗯啊h| 亚洲成av人在线视| 亚洲激情中文字幕| 日韩大片在线永久免费观看网站| 国产午夜精品理论片| 中文字幕第一页亚洲| 美国毛片亚洲社区在线观看| 宝宝你里面好烫很软不想出来| 伊大人香蕉久久网| 91成人爽a毛片一区二区| 欧美性大战xxxxx久久久| 国产换爱交换乱理伦片| 久久精品中文字幕大胸| 色综合a怡红院怡红院首页| 美国式禁忌芭芭拉| 婷婷综合五月天| 亚洲精品乱码久久久久久| 拍拍拍无挡视频免费观看1000| 日韩精品无码中文字幕一区二区 | 稚嫩娇小哭叫粗大撑破h| 在线观看日本www| 亚洲一区二区无码偷拍| 韩国免费乱理论片在线观看2018| 成年女性特黄午夜视频免费看| 免费播放美女一级毛片| 7m精品福利视频导航|