Go 디자인 패턴 : 공장



기본 클래스에서 개체의 "팩토리"를 만들고 상속된 클래스의 동작을 수정할 수 있는 다형성 동작을 구현할 수 있게 해주는 생성 패턴입니다.

일반적으로 일련의 개체를 공유하는 생성 논리를 재사용하는 데 사용됩니다.

Go는 엄밀히 말하면 객체 지향 언어는 아니지만 인터페이스와 상속에 대한 구성 개념을 통해 OOP 논리를 구현할 수 있습니다.

예시
유사한 방식으로 작동하는 일련의 제품(객체)이 있습니다. 각각에 대해 별도의 클래스를 만들거나 이 모든 논리를 기본 클래스에 넣어 각 제품에 대해 상속된 클래스를 만들 수 있습니다.
  • 먼저 "공장"에서 "만든"제품의 동작을 설명하는 인터페이스를 정의해야 합니다.

  • type IProduct interface {
        setStock(stock int)
        getStock() int
        setName(name string)
        getName() string
    }
    

  • 제품의 모양을 정의한 다음 인터페이스를 준수하기 위해 IProduct 메서드를 구현합니다. 이는 추상 클래스를 정의하는 것과 유사합니다.

  • type Computer struct {
        name  string
        stock int
    }
    
    func (c *Computer) setStock(stock int) {
        c.stock = stock
    }
    
    func (c *Computer) getStock() int {
        return c.stock
    }
    
    func (c *Computer) setName(name string) {
        c.name = name
    }
    
    func (c *Computer) getName() string {
        return c.name
    }
    

  • Computer 클래스에서 상속되는 제품 클래스를 만듭니다. 여기에는 상속에 대한 구성 개념이 적용됩니다.

  • type Laptop struct {
        Computer
    }
    
    func newLaptop() IProduct {
        return &Laptop{
            Computer: Computer{
                name:  "Laptop Computer",
                stock: 0,
            },
        }
    }
    
    type Desktop struct {
        Computer
    }
    
    func newDesktop() IProduct {
        return &Desktop{
            Computer: Computer{
                name:  "Desktop Computer",
                stock: 0,
            },
        }
    }
    
    

  • 마지막으로 팩토리 메소드를 "생성"해야 합니다. 이 메소드는 지정된 객체의 인스턴스를 반환합니다.

  • func GetComputerFactory(computerType string) (IProduct, error) {
        if computerType == "laptop" {
            return newLaptop(), nil
        } else if computerType == "desktop" {
            return newDesktop(), nil
        } else {
            return nil, fmt.Errorf("invalid computer type")
        }
    }
    

    코드 실행



    func PrintNameAndStock(p IProduct) {
        fmt.Printf("Product name: %s, with stock %d\n", p.getName(), p.getStock())
    }
    
    func main() {
        laptop, _ := GetComputerFactory("laptop")
        desktop, _ := GetComputerFactory("desktop")
    
        laptop.setStock(10)
        PrintNameAndStock(laptop)
        desktop.setStock(20)
        PrintNameAndStock(desktop)
    
    }
    

    산출

    Product name: Laptop Computer, with stock 10
    Product name: Desktop Computer, with stock 20
    


    전체 예




    package main
    
    import "fmt"
    
    type IProduct interface {
        setStock(stock int)
        getStock() int
        setName(name string)
        getName() string
    }
    
    type Computer struct {
        name  string
        stock int
    }
    
    func (c *Computer) setStock(stock int) {
        c.stock = stock
    }
    
    func (c *Computer) getStock() int {
        return c.stock
    }
    
    func (c *Computer) setName(name string) {
        c.name = name
    }
    
    func (c *Computer) getName() string {
        return c.name
    }
    
    type Laptop struct {
        Computer
    }
    
    func newLaptop() IProduct {
        return &Laptop{
            Computer: Computer{
                name:  "Laptop Computer",
                stock: 0,
            },
        }
    }
    
    type Desktop struct {
        Computer
    }
    
    func newDesktop() IProduct {
        return &Desktop{
            Computer: Computer{
                name:  "Desktop Computer",
                stock: 0,
            },
        }
    }
    
    func GetComputerFactory(computerType string) (IProduct, error) {
        if computerType == "laptop" {
            return newLaptop(), nil
        } else if computerType == "desktop" {
            return newDesktop(), nil
        } else {
            return nil, fmt.Errorf("invalid computer type")
        }
    }
    
    func PrintNameAndStock(p IProduct) {
        fmt.Printf("Product name: %s, with stock %d\n", p.getName(), p.getStock())
    }
    
    func main() {
        laptop, _ := GetComputerFactory("laptop")
        desktop, _ := GetComputerFactory("desktop")
    
        laptop.setStock(10)
        PrintNameAndStock(laptop)
        desktop.setStock(20)
        PrintNameAndStock(desktop)
    }
    
    


    도움이 되셨기를 바랍니다 😊😊

    좋은 웹페이지 즐겨찾기