大白話簡單工廠模式 (Simple Factory Pattern)

大白話簡單工廠模式 (Simple Factory Pattern)

從買車經歷提及

畢業兩年,碼農張小兩口沒法忍受擠公交,凌晨起牀搶火車票的痛苦,遂計劃買車。逛了多家4S店,最終定下日產某車型的轎車。4S店接受訂單後,向工廠說明車型,工廠隨後進行汽車製造,運輸到4S店中再到了小兩口的手上,小兩口終於成了有車一族。
仔細分析,4S銷售模式即爲典型的簡單工廠模式。下面從代碼的角度進行分析。html

無工廠模式

首先,咱們先分析4S店最初的模式(企業我的做坊階段,無工廠)。4S店賣車首先要有車,這裏只取日產部分車型逍客,軒逸和天籟。java

代碼片斷1 日產車父類,全部車型都繼承此類。學習

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

代碼片斷2 車型:逍客this

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

代碼片斷3 車型:軒逸code

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

代碼片斷4 車型:天籟htm

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

代碼片斷5 無工廠的4S店對象

/**
 * 4s店
 * @author coderzcr
 */
class FourS {
    /**
     * 獲取汽車
     * @param type 汽車型號
     */
    void getCar(String type) {
        NissanCar nissanCar = null;
        if ("1".equals(type)) {
            nissanCar = new Xtrail();
        } else if ("2".equals(type)) {
            nissanCar = new Sylphy();
        } else if ("3".equals(type)) {
            nissanCar = new Altima();
        }
        assert nissanCar != null;
        nissanCar.printCar();
    }

}

圖片1 無工廠模式類圖
無工廠模式類圖
由上圖能夠發現blog

  1. 4S店職責過多,不只須要銷售,還須要製造汽車,明白如何生產某型號的汽車。
  2. 耦合嚴重,若是須要發佈新的車型,還須要對4S進行修改(即學習更多的車型製造),無疑增大了4S店的壓力。

隨着企業的發展,企業認識到了問題的嚴重性,開始設立工廠。工廠負責製造汽車,4S店負責銷售汽車,只需告知工廠型號便可獲取汽車。繼承

代碼片斷6 汽車工廠接口

/**
 * 日產車工廠
 * @author coderzcr
 */
public class NissanCarFactory {
    /**
     * 生產汽車
     * @param type 汽車型號
     */
    NissanCar createCar(String type) {
        NissanCar nissanCar = null;
        if ("1".equals(type)) {
            nissanCar = new Xtrail();
        } else if ("2".equals(type)) {
            nissanCar = new Sylphy();
        } else if ("3".equals(type)) {
            nissanCar = new Altima();
        }
        return nissanCar;
    }
}

代碼片斷7 有工廠的4S店。

/**
 * 有工廠的4S店。
 *
 * @author coderzcr
 */
class FourS {

    NissanCarFactory nissanCarFactory;

    FourS(NissanCarFactory nissanCarFactory) {
        this.nissanCarFactory = nissanCarFactory;
    }

    /**
     * 獲取汽車
     *
     * @param type 汽車型號
     */
    void getCar(String type) {
        NissanCar nissanCar =  nissanCarFactory.createCar(type);
        nissanCar.printCar();
    }
}

圖片2 有工廠模式類圖
有工廠模式類圖

通過改造,4S店和工廠的職責進行了分離,減輕了4S店的壓力。當發佈新車型時,只需瞭解其型號告知工廠便可獲取到相應車輛。

簡單工廠模式定義

簡單工廠模式(Simple Factory Pattern):屬於類建立型模式。在簡單工廠模式中,能夠根據參數的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。

已上面舉例來解釋的話就是根據車型的不一樣製造不一樣型號的車。日產專門建造一個工廠來負責製造汽車,被創造的汽車都是日產車型。

簡單工廠模式結構

簡單工廠模式包含以下角色:

  • Factory:工廠角色
    工廠角色負責實現建立全部實例的內部邏輯。例子中得日產工廠(NissanFactory)
  • Product:抽象產品角色
    抽象產品角色是所建立的全部對象的父類,負責描述全部實例所共有的公共接口。例子中的日車車(NissanCar)
  • ConcreteProduct:具體產品角色
    具體產品角色是建立目標,全部建立的對象都充當這個角色的某個具體類的實例。例子中的逍客,軒逸,天籟。(Xtrail、Sylphy、Altima)

圖片3 簡單工廠模式
簡單工廠模式類圖

簡單工廠模式分析

將對象的建立和對象自己業務處理分離能夠下降系統的耦合度,使得二者修改起來都相對容易。

簡單工廠模式最大的問題在於工廠類的職責相對太重,增長新的產品須要修改工廠類的判斷邏輯,這一點與開閉原則是相違背的

簡單工廠模式的要點在於:當你須要什麼,只須要傳入一個正確的參數,就能夠獲取你所須要的對象,而無須知道其建立細節

參考文獻

1. 簡單工廠模式( Simple Factory Pattern ) — Graphic Design Patterns

相關文章
相關標籤/搜索