registry.go 544 B

1234567891011121314151617181920212223242526272829
  1. package shelter
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. type AnimlConstructor func() Animal
  7. var (
  8. registrMu sync.RWMutex
  9. registry = make(map[string]AnimlConstructor)
  10. )
  11. func Register(typeName string, constructor AnimlConstructor) {
  12. registrMu.Lock()
  13. defer registrMu.Unlock()
  14. registry[typeName] = constructor
  15. }
  16. func Create(typeName string) (Animal, error) {
  17. registrMu.RLock()
  18. defer registrMu.RUnlock()
  19. constructor, ok := registry[typeName]
  20. if !ok {
  21. return nil, fmt.Errorf("animl %s is not registered", typeName)
  22. }
  23. return constructor(), nil
  24. }