簡單工廠模式的定義
簡單工廠模式又叫靜態工廠模式,在簡單工廠模式中,可以根據不同的參數返回不同的實例,被創建的實例通常都有共同的接口。
UML圖
IProduct:接口。簡單工廠模式所創建的所有對象的接口,它負責描述所有實例要實現的公共接口。
Prouduct:具體子類,是簡單工廠模式的創建目標,可以有多種。
Factory:工廠類,簡單工廠模式的核心,它負責根據邏輯需求,創建所有實例。createProduct方法可以被外界直接調用,創建所需的實例。
示例:
- 有一個工廠,生產產品Product。
- 最近推出了3個產品ProductA/B/C,使用簡單工廠模式實現3款產品的生產。
產品接口
interface Product{
void Show();
}
3款產品
//具體產品類A
class ProductA implements Product{
@Override
public void Show() {
System.out.println("生產出了產品A");
}
}
//具體產品類B
class ProductB implements Product{
@Override
public void Show() {
System.out.println("生產出了產品C");
}
}
//具體產品類C
class ProductC implements Product{
@Override
public void Show() {
System.out.println("生產出了產品C");
}
}
簡單工廠類:
class Factory {
public static Product Manufacture(String ProductName){
//工廠類裏用switch語句控制生產哪種商品;
//使用者只需要調用工廠類的靜態方法就可以實現產品類的實例化。
switch (ProductName){
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
return null;
}
}
}
//工廠產品生產流程
public class SimpleFactoryPattern {
public static void main(String[] args){
Factory mFactory = new Factory();
//客戶要產品A
try {
//調用工廠類的靜態方法 & 傳入不同參數從而創建產品實例
mFactory.Manufacture("A").Show();
}catch (NullPointerException e){
System.out.println("沒有這一類產品");
}
//客戶要產品B
try {
mFactory.Manufacture("B").Show();
}catch (NullPointerException e){
System.out.println("沒有這一類產品");
}
//客戶要產品C
try {
mFactory.Manufacture("C").Show();
}catch (NullPointerException e){
System.out.println("沒有這一類產品");
}
//客戶要產品D
try {
mFactory.Manufacture("D").Show();
}catch (NullPointerException e){
System.out.println("沒有這一類產品");
}
}
}
輸出結果
生產出了產品A
生產出了產品C
生產出了產品C
沒有這一類產品
優缺點
優點
- 將創建實例的工作與使用實例的工作分開,使用者不必關心類對象如何創建,實現瞭解耦;
- 把初始化實例時的工作放到工廠裏進行,使代碼更容易維護。 更符合面向對象的原則 & 面向接口編程,而不是面向實現編程。
缺點
- 工廠類集中了所有實例(產品)的創建邏輯,一旦這個工廠不能正常工作,整個系統都會受到影響;
- 違背“開放 - 關閉原則”,一旦添加新產品就不得不修改工廠類的邏輯,這樣就會造成工廠邏輯過於複雜。
- 簡單工廠模式由於使用了靜態工廠方法,靜態方法不能被繼承和重寫,會造成工廠角色無法形成基於繼承的等級結構。