首頁 > 後端開發 > Golang > 主體

Go 設計模式#Factory

Susan Sarandon
發布: 2024-10-12 06:11:02
原創
211 人瀏覽過

Go Design Patterns #Factory

工廠方法

工廠方法是一種創建型設計模式,它提供了用於創建對象的接口,但允許子類更改將創建的對象的類型。工廠方法不是使用 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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板