>백엔드 개발 >Golang >디자인 패턴으로 이동 #Factory

디자인 패턴으로 이동 #Factory

Susan Sarandon
Susan Sarandon원래의
2024-10-12 06:11:02257검색

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() 메소드를 사용하여 공통 인터페이스(Car)를 정의합니다.

콘크리트 제품: 동작을 정의하는 특정 클래스(ElectricCar, GasCar)로 인터페이스를 구현합니다.

팩토리 인터페이스: Car 객체를 생성하기 위한 메서드(CreateCar())를 지정합니다.

공장 논리: 공장에서는 고객의 선호도에 따라 어떤 유형의 자동차를 만들 것인지 결정합니다. 이는 환경 변수를 사용하여 여기에 예시되어 있지만 어떤 논리를 기반으로 할 수도 있습니다.

클라이언트 코드: 공통 인터페이스를 통해 반환된 객체를 이용하여 생성 내역을 알지 못한 채 공장에서 자동차를 요청합니다.

위 내용은 디자인 패턴으로 이동 #Factory의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.