LoginSignup
1
1

More than 5 years have passed since last update.

Factory method patternメモ

Posted at

こういう感じのFactory method patternはよく使いそうなのでメモ

package main

import (
    "fmt"
    "errors"
)

const (
    PersonTypeSales     = 1
    PersonTypeOperator  = 2
)

type (

    PersonInterface interface {
        Greet() string
        GetType() int
    }

    Person struct {
        Type int
    }

    Salesperson struct {
        Person
    }

    Operator struct {
        Person
    }

    PersonFactory struct {}

)

// 共通メソッド
func (p Person) GetType() int {
    return p.Type
}

// 共通メソッド
func (p Person) Greet() string {
    return "I'm a person."
}

// 埋め込みStructのメソッドを上書き可能
func (p Salesperson) Greet() string {
    return "I'm a sales-person."
}

func (p Operator) Greet() string {
    return "I'm an operator."
}

// Factory method
func (p *PersonFactory) Get(personType int) (PersonInterface, error) {
    var person PersonInterface

    switch personType {
    case PersonTypeSales:
        person = Salesperson{Person{Type: personType}}
    case PersonTypeOperator:
        person = Operator{Person{Type: personType}}
    default:
        return nil, errors.New("Not found target type of person.")
    }

    return person, nil
}

func main() {
    factory := PersonFactory{}

    salesperson, _ := factory.Get(PersonTypeSales)
    operator, _ := factory.Get(PersonTypeOperator)

    fmt.Println(salesperson.Greet(), salesperson.GetType())
    fmt.Println(operator.Greet(), operator.GetType())
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1