設計模式 - 簡單工廠模式

簡單工廠模式嚴格來講並非一個設計模式,反而較像是一種編程習慣。編程

定義

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

結構

簡單工廠

簡單工廠包含了一下角色:bash

  • Factory: 工廠角色 負責根據不一樣的參數建立不一樣的實例。ide

  • IProduct: 抽象產品角色 全部產品實例的接口,負責描述全部產品實例的行爲。ui

  • Product(A B ..): 具象產品角色 全部產品的實例,實現了抽象產品定義的代碼spa

場景示例:

簡單工廠應用的場景比較對,那麼就根據做者的理解,拿做者工做中遇到的場景需求舉例: 平臺作一個機票代購業務,對接了兩個供應商A、B,用戶選擇完機票後,平臺拿着機票去供應商下單。下單時根據機票由那個供應商提供去相應的供應商去下單。設計

第一步就是定義一個下單接口。3d

public interface IVender {
    /**
     * 供應商下單方法
     */
    void order();
}

複製代碼

而後分別實現A、B供應商的下單方法。code

public class VendorA implements IVender {
    @Override
    public void order() {
        // 業務邏輯處理
        System.out.println("A供應商下單成功,下單時間" + new Date());
    }
}
複製代碼
public class VendorB implements IVender {
    @Override
    public void order() {
        // 業務邏輯處理
        System.out.println("B供應商下單成功,下單時間:" + new Date());
    }
}
複製代碼

接着定義一個工廠類,根據傳入的不一樣參數請求,分別建立不一樣的供應商實例並返回,若碰到無效的參數,則拋出異常。cdn

public class VendorFactory {

    public static IVender createVendor(String type) {
        switch (type) {
            case "A":
                return new VendorA();
            case "B":
                return new VendorB();
            default:
                throw new RuntimeException("供應商不存在");
        }
    }
}
複製代碼

最後,由咱們客戶端進行調用:

public class Client {
    public static void main(String[] args) {
        String type = "A";
        IVender iVender = VendorFactory.createVendor(type);
        iVender.order();
    }
}
複製代碼

若是咱們都寫在一個類中:

public class Client2 {
    private static final String TYPE_A = "A";
    private static final String TYPE_B = "B";

    public static void main(String[] args) {
        String type = "A";
        if (Objects.equals(TYPE_A, type)) {
            // A 供應商下單邏輯處理
            System.out.println("A供應商下單成功,下單時間" + new Date());
        } else if (Objects.equals(TYPE_B, type)) {
            // B 供應商下單邏輯處理
            System.out.println("A供應商下單成功,下單時間" + new Date());
        } else {
            throw new RuntimeException("供應商不存在");
        }
    }
}
複製代碼

第二種寫法,供應商下單邏輯較多的話會使客戶端變得十分複雜,後期維護起來也將是一個災難。若是新增長一個供應商,將會對這個類有這較大的改動,很明顯的違反了開閉原則迪米特法則

優勢

  • 工廠類含有必要的判斷邏輯,能夠決定在何時建立哪個產品類的實例,客戶端能夠免除直接建立產品對象的責任,而僅僅「消費」產品;簡單工廠模式經過這種作法實現了對責任的分割,它提供了專門的工廠類用於建立對象。
  • 客戶端無須知道所建立的具體產品類的類名,只須要知道具體產品類所對應的參數便可,對於一些複雜的類名,經過簡單工廠模式能夠減小使用者的記憶量。
  • 經過引入配置文件,能夠在不修改任何客戶端代碼的狀況下更換和增長新的具體產品類,在必定程度上提升了系統的靈活性。

缺點

  • 因爲工廠類集中了全部產品建立邏輯,一旦不能正常工做,整個系統都要受到影響。
  • 使用簡單工廠模式將會增長系統中類的個數,在必定程序上增長了系統的複雜度和理解難度。
  • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,有可能形成工廠邏輯過於複雜,不利於系統的擴展和維護。
  • 簡單工廠模式因爲使用了靜態工廠方法,形成工廠角色沒法造成基於繼承的等級結構。

使用場景

在如下狀況下可使用簡單工廠模式:

  • 工廠類負責建立的對象比較少:因爲建立的對象較少,不會形成工廠方法中的業務邏輯太過複雜。
  • 客戶端只知道傳入工廠類的參數,對於如何建立對象不關心:客戶端既不須要關心建立細節,甚至連類名都不須要記住,只須要知道類型所對應的參數。

總結

  • 建立型模式對類的實例化過程進行了抽象,可以將對象的建立與對象的使用過程分離。
  • 簡單工廠模式又稱爲靜態工廠方法模式,它屬於類建立型模式。在簡單工廠模式中,能夠根據參數的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。
  • 簡單工廠模式包含三個角色:工廠角色負責實現建立全部實例的內部邏輯;抽象產品角色是所建立的全部對象的父類,負責描述全部實例所共有的公共接口;具體產品角色是建立目標,全部建立的對象都充當這個角色的某個具體類的實例。
  • 簡單工廠模式的要點在於:當你須要什麼,只須要傳入一個正確的參數,就能夠獲取你所須要的對象,而無須知道其建立細節。
  • 簡單工廠模式最大的優勢在於實現對象的建立和對象的使用分離,將對象的建立交給專門的工廠類負責,可是其最大的缺點在於工廠類不夠靈活,增長新的具體產品須要修改工廠類的判斷邏輯代碼,並且產品較多時,工廠方法代碼將會很是複雜。
  • 簡單工廠模式適用狀況包括:工廠類負責建立的對象比較少;客戶端只知道傳入工廠類的參數,對於如何建立對象不關心。
相關文章
相關標籤/搜索