Factory method pattern is a creational pattern that uses factory methods to deal with the problem of cerating objects without having to specify the exact class of the object that will be created.
For example, I define an interface Pokemon and I have multiple types of pokemon that can satisfy this interface.
package pokemon
// Pokemon has a list of moves and attack.
type Pokemon interface {
Moves() []string
Attack() error
Level() uint
}
type charmander struct {
// List of attributes
}
func (c *charmander) Moves() []string {
return []string{}
}
func (c *charmander) Attack() error {
return nil
}
func (c *charmander) Level() uint {
return c.level
}
type squirtle struct {
// List of attributes
}
func (s *squirtle) Moves() []string {
return []string{}
}
func (s *squirtle) Attack() error {
return nil
}
func (s *squirtle) Level() uint {
return s.level
}
I am going to use a factory method to create Pokemon.
// Pokemons
const (
Charmander = "CHARMANDER"
Squirtle = "SQUIRTLE"
)
// NewPokemon is a factory method.
func NewPokemon(p string) Pokemon {
switch p {
case Charmander:
return &charmander{}
case Squirtle:
return &squirtle{}
default:
return nil
}
}