using System.Collections.Generic;
using System.Diagnostics;
namespace AbstractFactory
public interface ICreator<BaseType>
public class DerivedCreator<Derived, Base> : ICreator<Base>
where Derived : Base, new()
public class Factory<Key, Base>
private Dictionary<Key, ICreator<Base>> _map;
_map = new Dictionary<Key, ICreator<Base>>();
public void Register(Key key, ICreator<Base> creator)
Debug.Assert(!_map.ContainsKey(key), "key is already registered.");
public Base Create(Key key)
Debug.Assert(_map.ContainsKey(key), "key is not registered");
return _map[key].Create();
public class AbstractActivity
public class ActivityOne : AbstractActivity
Console.WriteLine("ActivityOne created");
public class ActivityTwo : AbstractActivity
Console.WriteLine("ActivityTwo created");
public class DerivedActivityCreator<Derived> : AbstractFactory.DerivedCreator<Derived, AbstractActivity>
where Derived : AbstractActivity, new()
public class ActivityFactory
private AbstractFactory.Factory<String, AbstractActivity> _factory;
_factory = new AbstractFactory.Factory<String, AbstractActivity>();
_factory.Register("ActivityOne", new DerivedActivityCreator<ActivityOne>());
_factory.Register("ActivityTwo", new DerivedActivityCreator<ActivityTwo>());
public AbstractActivity Create(String key)
return _factory.Create(key);
public static void Main(string[] args)
var activityFactory = new ActivityFactory();
var activity = activityFactory.Create("ActivityOne");