簡單工廠模式嚴格來講並非一個設計模式,反而較像是一種編程習慣。編程
簡單工廠模式(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("供應商不存在");
}
}
}
複製代碼
第二種寫法,供應商下單邏輯較多的話會使客戶端變得十分複雜,後期維護起來也將是一個災難。若是新增長一個供應商,將會對這個類有這較大的改動,很明顯的違反了開閉原則
與迪米特法則
。
在如下狀況下可使用簡單工廠模式: