什麼是簡單工廠模式?
簡單工廠模式(Simple Factory Pattern)是一種創建型設計模式,它透過一個工廠類別來實例化不同類型的物件。根據傳入的參數,工廠類別決定建立哪個特定類別的物件。簡單工廠模式通常用於減少客戶端程式碼對特定類別的依賴,確保程式碼更易於維護和擴展。
在簡單工廠模式中,工廠類別集中負責對象的創建邏輯,客戶端無需關心如何創建對象,而只需提供必要的參數給工廠類別即可。它的核心思想是將物件創建的過程從客戶端程式碼中抽離出來,由工廠來管理。了解其他的設計模式相關的可以點選查看 軟體工程中的設計模式:解決問題的最佳實踐
解決什麼問題?
簡單工廠模式解決了以下問題:
- 減少程式碼重複:將實例化邏輯集中到工廠類別中,減少了在客戶端重複編寫創建物件的程式碼。
- 解耦:客戶端不直接依賴具體類,減少了對實作細節的依賴,有助於後續的擴展和維護。
- 提升程式碼靈活性:可以根據傳入的參數動態地建立不同類型的對象,增強了程式碼的靈活性。
何時使用簡單工廠模式?
在以下場景中,我們一般會選擇簡單工廠模式:
- 需要建立大量不同類別的對象,但這些對象具有相同的介面或基類。
- 建立物件的邏輯比較複雜,集中管理會使程式碼更容易維護。
- 客戶端不需要直接關心物件建立的細節,只需提供參數即可。
簡單工廠模式的優缺點
優點:
- 簡化客戶端程式碼:將物件建立邏輯封裝在工廠類別中,客戶端只需與工廠互動。
- 程式碼結構清晰:集中管理物件建立邏輯,程式碼結構更清晰,維護起來更方便。
- 擴展性強:可以透過修改或擴充工廠類別來增加新的產品類型,而不需要修改客戶端程式碼。
缺點:
- 違反開閉原則:當新增產品類型時,需要修改工廠類別的程式碼,違反了「對擴充開放,對修改關閉」的原則。
- 單一職責問題:工廠類別承擔了創建所有物件的職責,可能會導致它過於複雜。
Golang 中簡單工廠模式的實現
我們透過一個實際的例子來展示如何在Golang 中實現簡單工廠模式。假設我們需要創建不同類型的車輛(如自行車、汽車和卡車),它們都實現了一個相同的接口 Vehicle
。
package main import "fmt" // Vehicle 是所有車輛的介面type Vehicle interface { Drive() string } // Bike 自行車實作了Vehicle 介面type Bike struct{} func (b *Bike) Drive() string { return "Bike is being driven" } // Car 汽車實作了Vehicle 介面type Car struct{} func (c *Car) Drive() string { return "Car is being driven" } // Truck 卡車實作了Vehicle 介面type Truck struct{} func (t *Truck) Drive() string { return "Truck is being driven" } // VehicleFactory 是一個簡單的工廠類,用於創建車輛實例type VehicleFactory struct{} func (vf *VehicleFactory) CreateVehicle(vType string) Vehicle { switch vType { case "bike": return &Bike{} case "car": return &Car{} case "truck": return &Truck{} default: return nil } } func main() { // 建立工廠實例factory : = &VehicleFactory{} // 透過工廠建立不同的車輛vehicle1 := factory.CreateVehicle("bike") fmt.Println(vehicle1.Drive()) vehicle2 := factory.CreateVehicle("car") fmt.Println(vehicle2. Drive()) vehicle3 := factory.CreateVehicle("truck") fmt.Println(vehicle3.Drive()) }
Golang 實作說明
- 首先我們定義了
Vehicle
接口,所有類型的車輛(Bike
、Car
和Truck
)都實作了該介面的Drive()
方法。 - 工廠類
VehicleFactory
提供了CreateVehicle()
方法,負責根據傳入的類型(bike
、car
、truck
)來建立對應的物件實例。 - 在
main()
函數中,透過工廠類別創建不同類型的車輛,並呼叫其Drive()
方法。
實際開發中的使用注意事項
- 保持工廠類的單一職責:雖然工廠類別承擔了創建物件的職責,但要注意不要讓它變得過於複雜。如果產品種類太多,可以考慮使用多個工廠類,或透過工廠方法模式來改進。
- 避免過度使用:簡單工廠模式雖然便捷,但如果產品種類非常多,且創建邏輯較為複雜,可能會導致工廠類過於龐大,難以維護。在這種情況下,可以考慮使用其他設計模式,例如工廠方法模式或抽象工廠模式。
- 輸入參數的驗證:實際使用時,應對工廠方法的參數進行驗證,避免因為錯誤輸入而導致創建失敗或程式崩潰。
- 擴充時要注意程式碼修改:每次增加新類型的產品時,都需要修改工廠類別的代碼,這違反了開閉原則。因此,如果系統的可擴展性要求很高,可能需要重新考慮設計方案。
參考連結
透過本文,你應該了解了簡單工廠模式的基本概念、使用場景及其在Golang 中的實作方法。這個設計模式可以有效簡化物件建立的過程,使程式碼更易於維護和擴展。代碼維護英文代碼維護英文代碼維護英文代碼維護英文代碼維護英語代碼維護英語代碼維護英文