https://sheremetov.com/oop/oop-pattern-factory-metho/