簡單工廠模式(Simple Factory Pattern)是一種建立型設計模式,用於物件的建立,它屬於工廠模式的一種。簡單工廠模式的主要目標是封裝物件的建立過程,使使用者端程式碼與具體類的範例化解耦,從而提高程式碼的可維護性和可延伸性。
簡單工廠模式定義了一個工廠類,該工廠類負責根據使用者端的需求建立不同型別的物件,而使用者端只需提供一個引數或者條件,工廠類就能返回相應的具體物件範例。
利用富士康代工生產小米手機、華為手機為例來說明一下簡單工廠模式,其中
富士康工廠就是簡單工廠,負責根據客戶(小米和華為)的要求來製造手機。
小米手機和 華為手機 是具體的產品,它們有不同的特性和功能,但都屬於手機產品。
在這個例子中,富士康工廠就像是一個手機制造工廠,客戶(小米和華為)只需要向工廠提出訂單(傳遞一個引數或條件,例如手機品牌),工廠根據客戶的要求生產出相應的手機產品。客戶不需要了解手機制造的具體細節,只需與工廠互動即可。這種方式將手機的建立過程與客戶程式碼解耦,使得使用者端更加簡潔,並且富士康工廠可以根據市場需求輕鬆地生產不同品牌的手機,而不需要修改使用者端程式碼。
簡單工廠模式在這個例子中幫助了富士康工廠代工製造手機,客戶只需要告訴工廠需要哪種手機,而無需關心手機的具體制造過程,這體現了簡單工廠模式的核心思想,即將物件的建立與使用者端程式碼解耦,從而提高了靈活性和可維護性。
簡單工廠模式的結構主要包括以下三個關鍵元素:
具體產品類是工廠類建立的物件型別,它們共用一個公共的抽象產品類或介面。每個具體產品類實現了抽象產品類或介面中定義的方法,以提供特定的功能和行為。
工廠類是簡單工廠模式的核心部分,負責根據使用者端的請求建立具體產品物件。工廠類通常包含一個或多個工廠方法,每個工廠方法用於建立不同型別的具體產品物件。工廠類的目標是封裝物件的建立邏輯,使使用者端免於瞭解具體產品的構造過程。
使用者端是使用簡單工廠模式的程式碼部分,負責向工廠類傳送請求以獲取所需的具體產品物件。使用者端通常不直接範例化具體產品物件,而是通過工廠類來獲取物件。
簡單工廠模式的關鍵思想是將物件的建立和使用者端解耦,使用者端只需要知道如何使用工廠類來獲取所需的物件,而無需關心物件的具體建立過程。這種模式有助於提高程式碼的可維護性和可延伸性,因為它允許在不修改使用者端程式碼的情況下新增新的具體產品類。
簡單工廠模式的實現步驟如下:
4.1 定義抽象產品類(Abstract Product)
首先,定義一個抽象產品類或介面,它宣告了具體產品類必須實現的方法。這個抽象產品類將統一具體產品的介面。
4.2 建立具體產品類(Concrete Products)
為每個具體產品建立一個相應的類,這些類應該實現抽象產品類中定義的方法。
具體產品類表示不同型別的物件,具體產品的特性和行為由這些類來定義。
4.3 建立工廠類(Factory)
建立一個工廠類,該工廠類負責物件的建立。
在工廠類中定義一個或多個工廠方法,用於根據使用者端的請求建立具體產品物件。
工廠方法通常會包括條件判斷或者其他邏輯,以確定建立哪個具體產品物件。
4.4 使用者端使用工廠類
使用者端不直接範例化具體產品物件,而是通過呼叫工廠類的方法來獲取所需的物件。
使用者端需要知道如何使用工廠類,以及如何傳遞引數或條件給工廠類來獲取合適的物件。
4.5 使用者端呼叫工廠方法
使用者端在需要具體產品物件的地方,呼叫工廠方法並傳遞必要的引數或條件。
工廠方法會根據引數或條件來建立並返回相應的具體產品物件。
總的來說,簡單工廠模式通過將物件的建立邏輯封裝在工廠類中,使使用者端程式碼與具體產品的構造過程解耦,從而提高了程式碼的可維護性和可延伸性。使用者端只需要關注如何使用工廠類來獲取物件,而無需瞭解物件的建立細節。這種模式適用於那些物件的建立過程相對簡單,不需要頻繁變化的場景。
首先,定義抽象手機類 AbstractMobile
,其中只包含一個抽象方法 action
:
public abstract class AbstractMobile {
public abstract void action();
}
接下來,建立具體手機類 XiaomiMobile
和 HuaweiMobile
,它們分別繼承自 AbstractMobile
並實現 action
方法:
public class XiaomiMobile extends AbstractMobile {
@Override
public void action() {
System.out.println("Xiaomi Mobile is performing an action.");
}
}
public class HuaweiMobile extends AbstractMobile {
@Override
public void action() {
System.out.println("Huawei Mobile is performing an action.");
}
}
然後,建立工廠類 FuFactory
,該工廠類包含一個方法 createMobile
用於根據使用者端的需求建立具體產品物件:
public class FuFactory {
public static AbstractMobile createMobile(String brand) {
if ("Xiaomi".equals(brand)) {
return new XiaomiMobile();
} else if ("Huawei".equals(brand)) {
return new HuaweiMobile();
} else {
throw new IllegalArgumentException("Invalid brand. Supported brands are Xiaomi and Huawei.");
}
}
}
最後,使用者端程式碼可以使用 FuFactory
來建立手機物件,並呼叫 action
方法:
public class Main {
public static void main(String[] args) {
AbstractMobile xiaomiPhone = FuFactory.createMobile("Xiaomi");
AbstractMobile huaweiPhone = FuFactory.createMobile("Huawei");
xiaomiPhone.action();
huaweiPhone.action();
}
}
這段 Java 程式碼將輸出以下結果:
Xiaomi Mobile is performing an action.
Huawei Mobile is performing an action.
這個範例中,我們定義了一個抽象方法 action
,要求具體手機類必須實現該方法。通過簡單工廠模式,我們成功地建立了 XiaomiMobile
和 HuaweiMobile
物件,並在使用者端程式碼中呼叫了 action
方法。這種方式可以確保每個具體手機類都必須提供一個特定的行為實現。
簡單工廠模式適用於以下應用場景:
需要根據條件建立不同物件的情況 :當系統中的某個類有多個子類,而使用者端在不同情況下需要建立不同子類的物件時,可以使用簡單工廠模式。通過簡單工廠,使用者端只需提供條件或引數,而無需瞭解物件的具體構造過程。
物件的建立過程相對簡單 :如果物件的建立邏輯相對簡單,不涉及複雜的初始化操作或依賴關係的管理,那麼簡單工廠模式是一個合適的選擇。它有助於將建立邏輯集中在一個工廠類中,提高了程式碼的可維護性。
需要降低使用者端和具體產品類之間的耦合度 :通過簡單工廠模式,使用者端程式碼與具體產品類之間的耦合度降低,因為使用者端只需要與工廠類互動,而無需直接與具體產品類互動。這使得使用者端更加靈活,能夠輕鬆適應變化。
需要在系統中集中管理物件的建立邏輯 :如果希望在整個系統中集中管理物件的建立邏輯,可以使用簡單工廠模式。這有助於在將來的維護和擴充套件中更容易地修改或新增新的產品類。
物件建立頻率較低 :如果某種型別的物件在系統中的建立頻率相對較低,而且不需要支援多型性,簡單工廠模式可以滿足需求,避免建立大量的工廠方法。
需要注意的是,雖然簡單工廠模式有其優點,但它也有一些缺點,例如不符合開閉原則,因為每次新增新的產品類都需要修改工廠類,可能導致工廠類變得龐大。因此,在某些情況下,工廠方法模式或抽象工廠模式可能更適合處理物件的建立需求。選擇適當的建立型模式取決於具體的專案需求和設計目標。
簡單工廠模式有一些優點和缺點,下面是簡單工廠模式的主要優缺點:
優點:
缺點:
簡單工廠模式是建立型設計模式之一,它通過一個工廠類來建立物件,使用者端只需要提供一個引數或條件,工廠類就能返回相應的具體物件範例。這種模式適用於物件的建立相對簡單的情況,但不支援多型性,每次新增新的產品類都需要修改工廠類。
工廠方法模式是建立在簡單工廠模式的基礎上的進一步抽象和擴充套件,它將物件的建立延遲到子類。每個具體產品類都有對應的工廠類,使用者端通過與工廠介面或抽象類互動,具體產品的建立由子類工廠來完成。工廠方法模式支援多型性,允許不同的具體工廠建立不同的產品物件。
抽象工廠模式是建立型設計模式,它提供一個介面或抽象類來建立一系列相關或相互依賴的物件,而無需指定它們的具體類。抽象工廠模式通常用於建立一組有關聯的產品,例如在製造電子裝置時,可能需要同時建立螢幕、主機板、CPU等相關元件,抽象工廠能夠確保這些元件之間的相容性。這種模式支援多型性,並且允許使用者端使用不同的具體工廠建立一組相關的產品。
這三種模式之間的關係可以看作是一種逐步抽象和擴充套件的關係。簡單工廠模式是最簡單的工廠模式,它將物件的建立過程封裝在一個工廠類中。工廠方法模式在簡單工廠的基礎上引入了多型性,通過子類工廠來建立不同型別的產品。抽象工廠模式進一步抽象,它用於建立一組相關的產品,並提供一種更高階別的抽象,以確保這些產品之間的協調和相容。選擇使用哪種工廠模式取決於具體的專案需求和設計目標。
總的來說,簡單工廠模式適用於物件建立過程相對簡單且穩定的情況,能夠有效地將物件的建立與使用分離,提高程式碼的可維護性和可延伸性。但在需要頻繁新增新的具體產品類或需要支援多型性的情況下,工廠方法模式或抽象工廠模式可能更適合。選擇適當的建立型模式取決於具體的專案需求和設計目標。