工廠方法模式(Factory Method Pattern)是一種創建型設計模式,它提供了一種將對象的實例化過程延遲到子類中去實現的方式。簡單來說,它定義了一個創建對象的接口,但讓子類決定要實例化哪一個類。這使得系統在不修改已有代碼的情況下,能夠引入新的產品類型,從而提高了系統的可擴展性和靈活性。
該模式的核心思想是將對象的創建與使用分離,客戶端只需要知道所需產品對應的工廠,而無需關心具體的創建細節。這符合“開閉原則”,即對擴展開放,對修改關閉。
工廠方法模式主要包含以下角色:
它們之間的關系可以概括為:具體工廠創建具體產品,但返回給客戶端的是抽象產品類型。
假設我們需要一個系統來生產不同的交通工具,如汽車和自行車。使用工廠方法模式可以實現如下:
`java
// 1. 抽象產品
interface Vehicle {
void drive();
}
// 2. 具體產品
class Car implements Vehicle {
@Override
public void drive() {
System.out.println("Driving a car...");
}
}
class Bicycle implements Vehicle {
@Override
public void drive() {
System.out.println("Riding a bicycle...");
}
}
// 3. 抽象工廠
abstract class VehicleFactory {
// 工廠方法
public abstract Vehicle createVehicle();
public void deliverVehicle() {
Vehicle vehicle = createVehicle();
System.out.println("Preparing delivery...");
vehicle.drive();
}
}
// 4. 具體工廠
class CarFactory extends VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Car();
}
}
class BicycleFactory extends VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Bicycle();
}
}
// 5. 客戶端代碼
public class Client {
public static void main(String[] args) {
VehicleFactory carFactory = new CarFactory();
carFactory.deliverVehicle();
VehicleFactory bikeFactory = new BicycleFactory();
bikeFactory.deliverVehicle();
}
}`
運行結果:`
Preparing delivery...
Driving a car...
Preparing delivery...
Riding a bicycle...`
在這個例子中,VehicleFactory 的 deliverVehicle() 方法是一個模板方法,它調用了抽象的 createVehicle() 工廠方法。具體的創建邏輯由子類 CarFactory 和 BicycleFactory 實現。客戶端只需與抽象工廠和抽象產品交互,完全與具體類解耦。
優點:
- 良好的封裝性:客戶端無需知道所創建的具體產品類名,只需要知道對應的工廠即可。
- 優秀的可擴展性:如果需要增加新的產品,只需添加一個新的具體產品類和一個對應的具體工廠類,無需修改現有代碼。
- 符合開閉原則:對擴展開放,對修改關閉。
- 解耦客戶端與具體產品:客戶端只依賴于抽象,降低了系統的耦合度。
適用場景:
- 當一個類無法預知它必須創建的對象的類時。
- 當一個類希望由其子類來指定它所創建的對象時。
- 當需要將對象的創建與使用分離,使系統更符合單一職責原則時。
- 在框架設計中,經常使用工廠方法模式讓用戶通過繼承來擴展框架的功能。
初學者容易混淆工廠方法模式和簡單工廠模式。它們的區別在于:
可以說,工廠方法模式是簡單工廠模式的進一步抽象和推廣。
工廠方法模式通過引入抽象工廠和具體工廠的層次結構,將對象的實例化延遲到子類,提供了一種靈活的擴展機制。它是面向對象設計中“依賴抽象,而非具體”這一原則的完美體現。在需要管理系統復雜性、提高代碼可維護性和可擴展性的場景下,工廠方法模式是一個極具價值的工具。掌握它,能幫助開發者構建出更加健壯和靈活的軟件架構。
如若轉載,請注明出處:http://www.jsjdhw.cn/product/65.html
更新時間:2026-01-09 03:39:55