概述
本文將解釋JAVA中的工廠設計模式:工廠方法和抽象工廠,并用實際例子來說明如何實現該模式。
工廠方法模式
比如為一家汽車制造商開發一款應用程序。起初,該客戶制造的車輛僅使用燃油發動機。因此,為了遵循單一責任原則(SRP)和開閉原則(OCP),我們使用工廠方法設計模式。
工廠方法模式通過將產品的構造代碼與使用該產品的代碼分離來解耦合。
首先,在我們的示例應用程序中,定義了MotorVehicle接口。這個接口只有一個方法build(),用于制造特定的機動車輛:
public interface MotorVehicle {
void build();
}
下一步是實現MotorVehicle接口的具體類。我們創造了兩種類型:摩托車和汽車:
public class Motorcycle implements MotorVehicle {
@Override
public void build() {
System.out.println("Build Motorcycle");
}
}
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()來創建特定類型的機動車輛,之前我們具有兩種類型的摩托車和汽車:
public class MotorcycleFactory extends MotorVehicleFactory {
@Override
protected MotorVehicle createMotorVehicle() {
return new Motorcycle();
}
}
public class CarFactory extends MotorVehicleFactory {
@Override
protected MotorVehicle createMotorVehicle() {
return new Car();
}
}
我們的應用程序是使用工廠方法模式設計,現在就可以隨心所欲地增加新的機動車輛。最后,我們看看使用UML表示法的最終設計是什么樣子的:
抽象工廠模式
比如兩家新的汽車品牌公司對我們上面設計的系統感興趣: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();
}
}
接下來是另一個NexGen工廠:
public class NextGenCorporation extends Corporation {
@Override
public MotorVehicle createMotorVehicle() {
return new NextGenMotorcycle();
}
@Override
public ElectricVehicle createElectricVehicle() {
return new NextGenElectricCar();
}
}
我們使用抽象工廠模式完成了實現。以下是我們自定義實現的UML圖:
結論
工廠方法使用繼承作為設計工具。而抽象工廠使用委托。
工廠方法依賴于派生類來實現,基類提供預期的行為,它是在方法上,而不是在類上。而抽象工廠被應用于一個類。
兩者都遵循OCP和SRP,產生了松散耦合的代碼,并為以后的更改擴展提供了更大的靈活性。