https://medium.com/@sumitsagar_20050/factory-method-pattern-and-abstract-factory-pattern-89fdfb8c364e