大白話工廠方法模式(Factory Method)

簡單工廠模式缺陷

大白話簡單工廠模式(Simple Factory Pattern)中經過買車的經歷解釋了簡單工廠模式。但熟悉設計模式的朋友會發現一些問題。java

  • 工廠類集中了全部實例(產品)的建立邏輯,一旦這個工廠不能正常工做,整個系統都會受到影響。用日產車工廠的例子來形容就是日產汽車的工廠負責全部車型的製造,當發生停電、火災等狀況時,汽車沒法正常製造,大大影響汽車的銷售,使企業陷入困境
  • 違背「開放 - 關閉原則」,一旦添加新產品就不得不修改工廠類的邏輯,這樣就會形成工廠邏輯過於複雜。這句話的意思是當企業發佈新產品,該工廠須要從新學習新車型的製造,加大工人壓力。

因此,隨着企業的發展,日產公司決定將每種車型進行分工廠製造,解決了上述問題。這種方法在設計模式中被稱爲工廠方法模式設計模式

簡單工廠模式改造

下面咱們從代碼的角度進行分析。4S店賣車首先要有車,這裏只取日產部分車型逍客,軒逸和天籟。
代碼片斷1 日產車父類,全部車型都繼承此類。ide

/**
 * 日產車
 * @author coderzcr
 */
abstract class NissanCar {
    String name;
    void printCar(){
        System.out.println(name+"汽車已製造完成");
    }
}

代碼片斷2 車型:逍客學習

/**
 * 車型:逍客
 * @author coderzcr
 */
class Xtrail extends NissanCar {
    Xtrail(){
        this.name = "逍客";
    }
}

代碼片斷3 車型:軒逸this

/**
 * 車型:軒逸
 * @author coderzcr
 */
class Sylphy extends NissanCar {
    Sylphy(){
        this.name = "軒逸";
    }
}

代碼片斷4 車型:天籟設計

/**
 * 車型:天籟
 * @author coderzcr
 */
class Altima extends NissanCar {
    Altima(){
        this.name="天籟";
    }
}

有了具體的車型要求,咱們須要對不一樣車型創建工廠。
代碼片斷5 日產工廠父類,全部工廠都繼承此類。code

/**
 * 日產車工廠
 * @author coderzcr
 */
public abstract class NissanCarFactory {
    /**
     * 生產汽車
     */
    abstract NissanCar createCar() ;

}

代碼片斷6 天籟工廠。htm

/**
 * 天籟工廠
 * @author coderzcr
 */
public class AltimaFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Altima();
    }
}

代碼片斷7 逍客工廠。對象

/**
 * 逍客工廠
 * @author coderzcr
 */
public class XtrailFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Xtrail();
    }
}

代碼片斷8 軒逸工廠。

/**
 * 軒逸工廠
 * @author coderzcr
 */
public class SylphyFactory extends NissanCarFactory {
    @Override
    NissanCar createCar() {
        return new Sylphy();
    }
}

圖1 多工廠類圖
多工廠類圖

工廠方法模式定義

工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣作的目的是將產品類的實例化操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。

工廠父類(日產車工廠)
工廠子類(軒逸工廠、天籟工廠、逍客工廠)
即產品的製造分配給子工廠,緩解單一工廠的壓力。

工廠方法模式結構

圖2 工廠方法模式結構
工廠方法模式結構

工廠方法模式包含以下角色:

  • Product:抽象產品
  • ConcreteProduct:具體產品
  • Factory:抽象工廠
  • ConcreteFactory:具體工廠

工廠方法模式分析

優勢分析

  • 工廠方法模式的優勢包括簡單工廠方法模式的優勢:用戶只須要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
  • 並且解決了簡單工廠存在的不符合開閉原則問題,
    在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其餘的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就能夠了。這樣,系統的可擴展性也就變得很是好,徹底符合「開閉原則」。

缺點分析

添加新產品時,須要添加一個具體工廠和具體產品,在必定程度上增長了系統的複雜度,有更多的類須要編譯和運行,會給系統帶來一些額外的開銷。

參考文獻

2. 工廠方法模式(Factory Method Pattern) — Graphic Design Patterns

相關文章
相關標籤/搜索