|
@@ -1,6 +1,9 @@
|
|
|
package shelter
|
|
package shelter
|
|
|
|
|
|
|
|
-import "sync"
|
|
|
|
|
|
|
+import (
|
|
|
|
|
+ "fmt"
|
|
|
|
|
+ "sync"
|
|
|
|
|
+)
|
|
|
|
|
|
|
|
type AnimlConstructor func() Animal
|
|
type AnimlConstructor func() Animal
|
|
|
|
|
|
|
@@ -8,3 +11,19 @@ var (
|
|
|
registrMu sync.RWMutex
|
|
registrMu sync.RWMutex
|
|
|
registry = make(map[string]AnimlConstructor)
|
|
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
|
|
|
|
|
+}
|