| 1234567891011121314151617181920212223242526272829 |
- package shelter
- import (
- "fmt"
- "sync"
- )
- type AnimlConstructor func() Animal
- var (
- registrMu sync.RWMutex
- registry = make(map[string]AnimlConstructor)
- )
- func Register(typeName string, constructor AnimlConstructor) {
- registrMu.Lock()
- defer registrMu.Unlock()
- registry[typeName] = constructor
- }
- func Create(typeName string) (Animal, error) {
- registrMu.RLock()
- defer registrMu.RUnlock()
- constructor, ok := registry[typeName]
- if !ok {
- return nil, fmt.Errorf("animl %s is not registered", typeName)
- }
- return constructor(), nil
- }
|