【工廠方法模式】工廠方法模式是一種常用的創(chuàng)建型設(shè)計(jì)模式,它定義了一個(gè)創(chuàng)建對(duì)象的接口,但讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。工廠方法將對(duì)象的創(chuàng)建過(guò)程封裝起來(lái),使系統(tǒng)更加靈活和可擴(kuò)展。
一、概述
工廠方法模式通過(guò)引入一個(gè)抽象的工廠類(lèi),由具體的子類(lèi)來(lái)實(shí)現(xiàn)對(duì)象的創(chuàng)建。這種模式的核心思想是“將對(duì)象的創(chuàng)建與使用分離”,從而提高系統(tǒng)的靈活性和可維護(hù)性。
二、結(jié)構(gòu)組成
| 名稱 | 說(shuō)明 |
| Product | 定義產(chǎn)品接口或抽象類(lèi),所有具體產(chǎn)品都實(shí)現(xiàn)該接口或繼承該類(lèi)。 |
| ConcreteProduct | 具體的產(chǎn)品類(lèi),實(shí)現(xiàn)Product接口或繼承Product類(lèi)。 |
| Creator | 定義工廠類(lèi)的接口,包含一個(gè)工廠方法(Factory Method),返回Product類(lèi)型。 |
| ConcreteCreator | 具體的工廠類(lèi),實(shí)現(xiàn)Creator接口,并重寫(xiě)工廠方法以返回具體的Product實(shí)例。 |
三、優(yōu)點(diǎn)
| 優(yōu)點(diǎn) | 說(shuō)明 |
| 松耦合 | 客戶端無(wú)需知道具體產(chǎn)品類(lèi),只需依賴Product接口或抽象類(lèi)。 |
| 易于擴(kuò)展 | 新增產(chǎn)品時(shí),只需添加新的ConcreteProduct和ConcreteCreator類(lèi),無(wú)需修改原有代碼。 |
| 符合開(kāi)閉原則 | 對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。 |
| 提高代碼復(fù)用性 | 工廠方法可以被多個(gè)地方調(diào)用,避免重復(fù)代碼。 |
四、缺點(diǎn)
| 缺點(diǎn) | 說(shuō)明 |
| 增加系統(tǒng)復(fù)雜度 | 引入更多的類(lèi),增加系統(tǒng)復(fù)雜性。 |
| 需要額外的類(lèi)來(lái)實(shí)現(xiàn) | 每個(gè)產(chǎn)品都需要一個(gè)對(duì)應(yīng)的工廠類(lèi),可能造成類(lèi)的數(shù)量增加。 |
| 不適合簡(jiǎn)單場(chǎng)景 | 對(duì)于簡(jiǎn)單的對(duì)象創(chuàng)建,使用工廠方法可能顯得過(guò)于復(fù)雜。 |
五、適用場(chǎng)景
| 場(chǎng)景 | 說(shuō)明 |
| 對(duì)象創(chuàng)建邏輯復(fù)雜 | 當(dāng)對(duì)象的創(chuàng)建過(guò)程比較復(fù)雜時(shí),使用工廠方法可以簡(jiǎn)化客戶端代碼。 |
| 系統(tǒng)需要?jiǎng)討B(tài)擴(kuò)展 | 當(dāng)系統(tǒng)需要支持多種產(chǎn)品類(lèi)型,并且未來(lái)可能會(huì)有新增產(chǎn)品時(shí)。 |
| 客戶端不需要知道具體類(lèi) | 客戶端只需要使用統(tǒng)一的接口來(lái)獲取產(chǎn)品,而不需要關(guān)心具體實(shí)現(xiàn)。 |
六、示例代碼(Java)
```java
// Product 接口
interface Product {
void use();
}
// 具體產(chǎn)品A
class ConcreteProductA implements Product {
public void use() {
System.out.println("使用產(chǎn)品A");
}
}
// 具體產(chǎn)品B
class ConcreteProductB implements Product {
public void use() {
System.out.println("使用產(chǎn)品B");
}
}
// Creator 抽象類(lèi)
abstract class Creator {
public abstract Product factoryMethod();
public void doSomething() {
Product product = factoryMethod();
product.use();
}
}
// 具體工廠A
class ConcreteCreatorA extends Creator {
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 具體工廠B
class ConcreteCreatorB extends Creator {
public Product factoryMethod() {
return new ConcreteProductB();
}
}
```
七、總結(jié)
工廠方法模式通過(guò)將對(duì)象的創(chuàng)建交給子類(lèi)處理,實(shí)現(xiàn)了對(duì)象創(chuàng)建與使用的解耦。它提高了系統(tǒng)的靈活性和可維護(hù)性,適用于需要?jiǎng)討B(tài)擴(kuò)展產(chǎn)品類(lèi)型的場(chǎng)景。雖然增加了系統(tǒng)復(fù)雜度,但在大型項(xiàng)目中具有重要的應(yīng)用價(jià)值。


