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 }