Use an abstract factory + dependency injector + dependency injection container for object creation
MIT LicenseMIT