using System;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
string s = Factory.Instance.Create<string>();
Console.WriteLine(s);
int i = Factory.Instance.Create<int>();
Console.WriteLine(i);
}
}
class Factory {
private readonly IDictionary<Type,Func<object>> registry = new Dictionary<Type,Func<object>>();
private static Factory instance;
public static Factory Instance {
get {
if (instance != null)
return instance;
var f = new Factory();
f.Register<string>(() => "hello");
f.Register<int>(() => 123);
instance = f;
return instance;
}
}
public void Register<T>(Func<T> make) {
registry.Add(typeof(T), () => (object)make());
}
public T Create<T>() {
return (T)registry[typeof(T)]();
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlzdHJpbmcgcyA9IEZhY3RvcnkuSW5zdGFuY2UuQ3JlYXRlPHN0cmluZz4oKTsKCQlDb25zb2xlLldyaXRlTGluZShzKTsKCQlpbnQgaSA9IEZhY3RvcnkuSW5zdGFuY2UuQ3JlYXRlPGludD4oKTsKCQlDb25zb2xlLldyaXRlTGluZShpKTsKCX0KfQoKY2xhc3MgRmFjdG9yeSB7CiAgICBwcml2YXRlIHJlYWRvbmx5IElEaWN0aW9uYXJ5PFR5cGUsRnVuYzxvYmplY3Q+PiByZWdpc3RyeSA9IG5ldyBEaWN0aW9uYXJ5PFR5cGUsRnVuYzxvYmplY3Q+PigpOwogICAgcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeSBpbnN0YW5jZTsKICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBJbnN0YW5jZSB7CiAgICAgICAgZ2V0IHsKICAgICAgICAJaWYgKGluc3RhbmNlICE9IG51bGwpCiAgICAgICAgCSAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgCXZhciBmID0gbmV3IEZhY3RvcnkoKTsKICAgICAgICAJZi5SZWdpc3RlcjxzdHJpbmc+KCgpID0+ICJoZWxsbyIpOwogICAgICAgIAlmLlJlZ2lzdGVyPGludD4oKCkgPT4gMTIzKTsKICAgICAgICAJaW5zdGFuY2UgPSBmOwogICAgICAgIAlyZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgfQogICAgfQogICAgcHVibGljIHZvaWQgUmVnaXN0ZXI8VD4oRnVuYzxUPiBtYWtlKSB7CiAgICAgICAgcmVnaXN0cnkuQWRkKHR5cGVvZihUKSwgKCkgPT4gKG9iamVjdCltYWtlKCkpOwogICAgfQogICAgcHVibGljIFQgQ3JlYXRlPFQ+KCkgewogICAgICAgIHJldHVybiAoVClyZWdpc3RyeVt0eXBlb2YoVCldKCk7CiAgICB9Cn0=