1. 工廠模式簡介
工廠模式是一種創建型設計模式,主要用于創建對象實例。?它通過定義一個接口或抽象類來創建對象,而不是直接實例化具體類,從而將對象的創建過程與使用過程分離。
工廠模式通常分為兩種類型:
-
簡單工廠模式(Simple Factory): 這種模式并不是GoF設計模式之一,但在實際應用中非常常見。 簡單工廠模式通過一個工廠類來負責創建對象,根據傳入的參數的不同,返回不同類型的實例。
-
工廠方法模式(Factory Method): 工廠方法模式定義一個創建對象的接口,但由子類決定實例化哪個類。這樣,工廠方法模式讓類的實例化推遲到子類中進行。
2.代碼演示
假設我們有一個咖啡店,咖啡店可以制作不同種類的咖啡,如美式咖啡和拿鐵咖啡。我們將分別使用簡單工廠模式和工廠方法模式來演示創建不同的咖啡。
2.1 共用代碼
coffee相關的代碼是兩種工廠模式共用的,如下:
/** 抽象的Coffee頂層類 */
public abstract class Coffee {public abstract void prepare();
}/** 美式咖啡 */
public class AmericanoCoffee extends Coffee {@Overridepublic void prepare() {System.out.println(" prepare AmericanoCoffee");}
}/** 拿鐵咖啡 */
public class LatteCoffee extends Coffee {@Overridepublic void prepare() {System.out.println(" prepare LatteCoffee");}
}
2.2 簡單工廠模式
/** * 簡單工廠模式(Simple Factory):* 簡單工廠模式通過一個工廠類來負責創建對象,根據傳入的參數的不同,返回不同類型的實例。* 這種模式并不是GoF設計模式之一,但在實際應用中非常常見。
*/
public class CoffeeSimpleFactory {private static final String AMERICANO = "Americano";private static final String LATTE = "Latte";public static Coffee createCoffee(String coffeeType) {if (AMERICANO.equals(coffeeType)) {return new AmericanoCoffee();}if (LATTE.equals(coffeeType)) {return new LatteCoffee();}return null;}
}
簡單工廠模式對應的類圖:
2.2 工廠方法模式
/*** 工廠方法模式(Factory Method):* 定義一個創建對象的接口, 但由子類決定實例化哪個類, 工廠方法模式讓類的實例化推遲到子類中進行。*/
public interface CoffeeFactory {/*** 創建咖啡** @return Coffee*/Coffee createCoffee();
}/** 美式咖啡工廠 */
public class AmericanoCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee createCoffee() {return new AmericanoCoffee();}
}/** 拿鐵咖啡工廠 */
public class LatteCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee createCoffee() {return new LatteCoffee();}
}//--------------------------------------------------------/** 使用咖啡工廠創建咖啡 */
public class CoffeeMainProcess {private static final String AMERICANO = "Americano";private static final String LATTE = "Latte";private static final Map<String, CoffeeFactory> CACHED_COFFEE_FACTORY = new ConcurrentHashMap<>(16);static {CACHED_COFFEE_FACTORY.put(AMERICANO, new AmericanoCoffeeFactory());CACHED_COFFEE_FACTORY.put(LATTE, new LatteCoffeeFactory());}public static Coffee createCoffee(String coffeeType) {if (StringUtils.isEmpty(coffeeType) || !CACHED_COFFEE_FACTORY.containsKey(coffeeType)) {return null;}CoffeeFactory coffeeFactory = CACHED_COFFEE_FACTORY.get(coffeeType);return coffeeFactory.createCoffee();}
}
工廠方法模式對應的類圖:
工廠方法模式的優點:
- 解耦:將對象的創建與使用分離,降低了代碼的耦合度。
- 擴展性:新增產品時,只需添加對應的具體產品類和具體工廠類,符合開閉原則。
工廠方法模式的缺點:
- 復雜性增加:需要為每一個產品創建一個具體工廠類,增加了系統的復雜度。
- 類數量增多:可能導致類數量增多,增加維護成本。
工廠方法模式適合場景:
- 在需要靈活創建對象并且對象類型較多的場景中使用。