工廠方法模式(Factory Method Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種將對(duì)象的實(shí)例化過(guò)程延遲到子類中去實(shí)現(xiàn)的方式。簡(jiǎn)單來(lái)說(shuō),它定義了一個(gè)創(chuàng)建對(duì)象的接口,但讓子類決定要實(shí)例化哪一個(gè)類。這使得系統(tǒng)在不修改已有代碼的情況下,能夠引入新的產(chǎn)品類型,從而提高了系統(tǒng)的可擴(kuò)展性和靈活性。
該模式的核心思想是將對(duì)象的創(chuàng)建與使用分離,客戶端只需要知道所需產(chǎn)品對(duì)應(yīng)的工廠,而無(wú)需關(guān)心具體的創(chuàng)建細(xì)節(jié)。這符合“開(kāi)閉原則”,即對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
工廠方法模式主要包含以下角色:
它們之間的關(guān)系可以概括為:具體工廠創(chuàng)建具體產(chǎn)品,但返回給客戶端的是抽象產(chǎn)品類型。
假設(shè)我們需要一個(gè)系統(tǒng)來(lái)生產(chǎn)不同的交通工具,如汽車和自行車。使用工廠方法模式可以實(shí)現(xiàn)如下:
`java
// 1. 抽象產(chǎn)品
interface Vehicle {
void drive();
}
// 2. 具體產(chǎn)品
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();
}
}`
運(yùn)行結(jié)果:`
Preparing delivery...
Driving a car...
Preparing delivery...
Riding a bicycle...`
在這個(gè)例子中,VehicleFactory 的 deliverVehicle() 方法是一個(gè)模板方法,它調(diào)用了抽象的 createVehicle() 工廠方法。具體的創(chuàng)建邏輯由子類 CarFactory 和 BicycleFactory 實(shí)現(xiàn)。客戶端只需與抽象工廠和抽象產(chǎn)品交互,完全與具體類解耦。
優(yōu)點(diǎn):
- 良好的封裝性:客戶端無(wú)需知道所創(chuàng)建的具體產(chǎn)品類名,只需要知道對(duì)應(yīng)的工廠即可。
- 優(yōu)秀的可擴(kuò)展性:如果需要增加新的產(chǎn)品,只需添加一個(gè)新的具體產(chǎn)品類和一個(gè)對(duì)應(yīng)的具體工廠類,無(wú)需修改現(xiàn)有代碼。
- 符合開(kāi)閉原則:對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。
- 解耦客戶端與具體產(chǎn)品:客戶端只依賴于抽象,降低了系統(tǒng)的耦合度。
適用場(chǎng)景:
- 當(dāng)一個(gè)類無(wú)法預(yù)知它必須創(chuàng)建的對(duì)象的類時(shí)。
- 當(dāng)一個(gè)類希望由其子類來(lái)指定它所創(chuàng)建的對(duì)象時(shí)。
- 當(dāng)需要將對(duì)象的創(chuàng)建與使用分離,使系統(tǒng)更符合單一職責(zé)原則時(shí)。
- 在框架設(shè)計(jì)中,經(jīng)常使用工廠方法模式讓用戶通過(guò)繼承來(lái)擴(kuò)展框架的功能。
初學(xué)者容易混淆工廠方法模式和簡(jiǎn)單工廠模式。它們的區(qū)別在于:
可以說(shuō),工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。
工廠方法模式通過(guò)引入抽象工廠和具體工廠的層次結(jié)構(gòu),將對(duì)象的實(shí)例化延遲到子類,提供了一種靈活的擴(kuò)展機(jī)制。它是面向?qū)ο笤O(shè)計(jì)中“依賴抽象,而非具體”這一原則的完美體現(xiàn)。在需要管理系統(tǒng)復(fù)雜性、提高代碼可維護(hù)性和可擴(kuò)展性的場(chǎng)景下,工廠方法模式是一個(gè)極具價(jià)值的工具。掌握它,能幫助開(kāi)發(fā)者構(gòu)建出更加健壯和靈活的軟件架構(gòu)。
如若轉(zhuǎn)載,請(qǐng)注明出處:http://www.hh13377180878.cn/product/65.html
更新時(shí)間:2026-01-19 14:21:12
PRODUCT