工廠方法是一種創建型設計模式,它提供了用於創建對象的接口,但允許子類更改將創建的對象的類型。工廠方法不是使用 new 直接實例化對象,而是將對象創建的責任委託給子類或方法,從而提高了靈活性和可擴展性。
當需要建立對象,但您事先不知道所需對象的確切類別時。應用程式需要處理具有共同行為但實現不同的不同類型的物件。此外,您希望避免每次新增類型的物件或建立物件的方式變更時都修改程式碼。
複雜的物件建立:直接實例化類別可以將程式碼與特定的實作連結起來,使其變得僵化且難以維護。
動態物件建立:在很多情況下,所需物件的型別可能要到執行時才知道,這個決定應該要靈活。
實例化的封裝:物件建立邏輯應與客戶端程式碼分離,因此物件建立方式的變更不會影響系統的其餘部分。
可擴充性:當您需要新增類型的產品(物件)時,您需要一個可避免修改現有程式碼的可擴充解決方案。
想像一下一家汽車工廠,您在那裡訂購一輛汽車,但根據您的喜好(例如電動或燃氣),工廠組裝並為您提供合適的汽車類型。客戶不需要知道汽車組裝的具體細節——他們只需要收到產品。
package main import ( "fmt" "os" ) // Step 1: Define the Product Interface type Car interface { Drive() string FuelType() string } // Step 2: Concrete Products (Electric Car and Gas Car) type ElectricCar struct{} func (e *ElectricCar) Drive() string { return "Driving an electric car" } func (e *ElectricCar) FuelType() string { return "Powered by electricity" } type GasCar struct{} func (g *GasCar) Drive() string { return "Driving a gas-powered car" } func (g *GasCar) FuelType() string { return "Powered by gasoline" } // Step 3: Define the Factory Interface type CarFactory interface { CreateCar(brand string) Car } type carFactory struct{} func (carFactory *carFactory) CreateCar() Car { carPreference := os.Getenv("CAR_PREFERENCE") if carPreference == "electric" { return &ElectricCar{} } // here we just instantiate the struct, but you could also // have another functions to help create the object if it's complex return &GasCar{} } // Step 4: Client Code func main() { // Client uses the factory to create objects carFactory := carFactory{} // Creating a Gas Car gasCar := carFactory.CreateCar() fmt.Println(gasCar.Drive()) // Output: Driving a gas-powered car fmt.Println(gasCar.FuelType()) // Output: Powered by gasoline // Creating an Electric Car os.Setenv("CAR_PREFERENCE", "electric") electricCar := carFactory.CreateCar() fmt.Println(electricCar.Drive()) // Output: Driving an electric car fmt.Println(electricCar.FuelType()) // Output: Powered by electricity }
產品介面:使用 Drive() 和 FuelType() 方法定義通用介面(汽車)。
具體產品:使用定義其行為的特定類別(ElectricCar、GasCar)實作介面。
工廠介面:指定用於建立 Car 物件的方法(CreateCar())。
工廠邏輯:工廠根據客戶的喜好決定要生產哪種類型的汽車。此處透過使用環境變數進行範例,但它可以基於任何邏輯。
客戶端程式碼:在不知道創建細節的情況下,透過通用介面使用傳回的物件向工廠要求汽車。
以上是Go 設計模式#Factory的詳細內容。更多資訊請關注PHP中文網其他相關文章!