Java 中的工廠設計模式
一、概述
在本教程中,我們將解釋 Java 中的工廠設計模式。我們描述了兩種模式:工廠方法和抽象工廠。兩者都是創造性的設計模式。我們將使用一個示例來說明這些模式。
2.工廠方法模式
首先,我們需要定義一個例子。我們正在為一家汽車製造商開發一款應用程序。最初,我們只有一個客戶。該客戶製造了僅配備燃油發動機的車輛。所以,為了遵循單一職責原則(SRP)和開閉原則(OCP),我們使用了工廠方法設計模式。
在我們跳入一些代碼之前,我們為這個模式定義一個默認的 UML 圖:
使用上面的 UML 圖作為參考,我們定義了與此模式相關的一些主要概念。工廠方法模式通過將Product
的構造代碼與使用該Product
的代碼分開來放鬆耦合代碼。這種設計使得從應用程序的其餘部分中獨立提取Product
結構變得容易。此外,它允許在不破壞現有代碼的情況下引入新產品。
讓我們進入代碼。首先,在我們的示例應用程序中,我們定義了MotorVehicle
接口。這個接口只有一個方法build()
。該方法用於製造特定的機動車輛。界面的代碼片段:
public interface MotorVehicle {
void build();
}
下一步是實現實現MotorVehicle
接口的具體類。我們創建兩種類型: Motorcycle
和Car
。第一個的代碼是:
public class Motorcycle implements MotorVehicle {
@Override
public void build() {
System.out.println("Build Motorcycle");
}
}
對於Car
類,代碼為:
public class Car implements MotorVehicle {
@Override
public void build() {
System.out.println("Build Car");
}
}
然後,我們創建MotorVehicleFactory
類。此類負責創建每個新的車輛實例。它是一個抽像類,因為它為其特定工廠製造特定車輛。這個類的代碼是:
public abstract class MotorVehicleFactory {
public MotorVehicle create() {
MotorVehicle vehicle = createMotorVehicle();
vehicle.build();
return vehicle;
}
protected abstract MotorVehicle createMotorVehicle();
}
正如您所注意到的,方法create()
調用抽象方法createMotorVehicle()
來創建特定類型的機動車輛。這就是為什麼每個特定的機動車工廠都必須實施其正確的MotorVehicle
類型。之前,我們實現了兩種MotorVehicle
類型, Motorcycle
和Car
。現在,我們從我們的基類MotorVehicleFactory
來實現兩者。
首先是MotorcycleFactory
類:
public class MotorcycleFactory extends MotorVehicleFactory {
@Override
protected MotorVehicle createMotorVehicle() {
return new Motorcycle();
}
}
然後, CarFactory
類:
public class CarFactory extends MotorVehicleFactory {
@Override
protected MotorVehicle createMotorVehicle() {
return new Car();
}
}
就這樣。我們的應用程序是使用工廠方法模式設計的。我們現在可以添加任意數量的新機動車輛。最後,我們需要使用 UML 符號查看最終設計的外觀:
3. 抽象工廠模式
在我們的第一次應用程序迭代之後,兩家新的汽車品牌公司對我們的系統感興趣: NextGen
和FutureVehicle
。這些新公司不僅生產純燃料汽車,還生產電動汽車。每個公司都有自己的車輛設計。
我們當前的系統還沒有準備好應對這些新情況。我們必須支持電動汽車,並考慮到每個公司都有自己的設計。為了解決這些問題,我們可以使用抽象工廠模式。這種模式在我們剛開始使用工廠方法模式,需要將我們的系統演進到一個更複雜的系統時常用。它將產品創建代碼集中在一個地方。 UML 表示是:
我們已經有了MotorVehicle
接口。此外,我們必須添加一個接口來表示電動汽車。新界面的代碼片段是:
public interface ElectricVehicle {
void build();
}
接下來,我們創建我們的抽象工廠。新類是抽象的,因為對象創建的責任將由我們的具體工廠負責。此行為遵循 OCP 和 SRP。讓我們進入類定義:
public abstract class Corporation {
public abstract MotorVehicle createMotorVehicle();
public abstract ElectricVehicle createElectricVehicle();
}
在我們為每個公司創建混凝土工廠之前,我們必須為我們的新公司實施一些車輛。讓我們為FutureVehicle
公司創建一些新類。
public class FutureVehicleMotorcycle implements MotorVehicle {
@Override
public void build() {
System.out.println("Future Vehicle Motorcycle");
}
}
然後,電動汽車實例:
public class FutureVehicleElectricCar implements ElectricVehicle {
@Override
public void build() {
System.out.println("Future Vehicle Electric Car");
}
}
我們為NexGen
公司做同樣的事情:
public class NextGenMotorcycle implements MotorVehicle {
@Override
public void build() {
System.out.println("NextGen Motorcycle");
}
}
另外,其他電動車的具體實現:
public class NextGenElectricCar implements ElectricVehicle {
@Override
public void build() {
System.out.println("NextGen Electric Car");
}
}
最後,我們準備建造我們的混凝土工廠。一、 FutureVehicle
工廠:
public class FutureVehicleCorporation extends Corporation {
@Override
public MotorVehicle createMotorVehicle() {
return new FutureVehicleMotorcycle();
}
@Override
public ElectricVehicle createElectricVehicle() {
return new FutureVehicleElectricCar();
}
}
接下來,另一個:
public class NextGenCorporation extends Corporation {
@Override
public MotorVehicle createMotorVehicle() {
return new NextGenMotorcycle();
}
@Override
public ElectricVehicle createElectricVehicle() {
return new NextGenElectricCar();
}
}
它完成了。我們使用抽象工廠模式完成實現。這是我們自定義實現的 UML 圖:
4. 工廠方法與抽象工廠
綜上所述,工廠方法使用繼承作為設計工具。同時,抽象工廠使用委託。第一個依賴派生類來實現,而基類提供預期的行為。此外,它是 over-method 而不是 class 。另一方面,抽象工廠應用於類。兩者都遵循 OCP 和 SRP ,生成鬆散耦合的代碼,並為我們代碼庫的未來更改提供更大的靈活性。創建代碼在一個地方。
5.結論
最後,我們對工廠設計模式進行了演練。我們描述了工廠方法和抽象工廠。我們提供了一個示例係統來說明這些模式的使用。此外,我們還簡要比較了這兩種模式。
和往常一樣,代碼片段在 GitHub 上結束了。