介紹
工廠模式的出現,在於我們創建對象時,希望不要對客戶端暴露創建邏輯,而是通過一個共同的接口來指向新創建的對象。
何時使用:明確地計劃在不同條件下創建不同實例對象
關鍵步驟:創建過程在工廠類中執行,通過一個方法返回給使用者。
優點:
1. 一個調用者想創建一個對象,只要知道其名稱就可以了。
2. 擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。
3. 屏蔽產品的具體實現,調用者只關心產品的接口。
缺點:
1. 每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事
2. 不符合開閉原則,工廠類即使寫好,後期隨著業務需求,仍然需要修改工廠類方法
核心思想:
1. 我們將這個模式分為工廠類,使用類,產品類。將原本應用在使用類的具體創建對象邏輯代碼抽出放置到工廠類的一個方法。使用類只需要傳入參數,工廠類的該方法返回其類型相對應的產品類。
2. 產品類最好實現一個接口。由一個超類來控制返回類型。這樣方便向上轉型,且符合六個原則中的依賴倒轉原則和里氏代換原則
簡單工廠
簡單工廠並不是設計模式,而是一種編程習慣。
示例
產品超類
public interface Car{
public void print();
}
產品子類
public class BenZ implements Car{
public void print(){
System.out.print("我是奔馳");
}
}
public class BMW implements Car{
public void print(){
System.out.print("我是寶馬");
}
}
public class Volkswagen implements Car{
public void print(){
System.out.print("我是大眾");
}
}
工廠類
public class CarFactory{
public Car getCar(String type){
if(type==null){
return null;
}
if(type.equals("bmw")){
return new BMW();
}
if(type.equals("volkswagen")){
return new Volkswagen ();
}
if(type.equals("benz")){
return new BenZ();
}
return null;
}
}
使用類
public class CarStore{
public static void main(String[] args) {
CarFactory factory = new CarFacotry();
Car car = factory.getCar("benz");
car.print();
car = factory.getCar("bmw");
car.print();
car = factory.getCar("volkswagen");
car.print();
}
}
打印結果