Abstract factory pattern
Abstract factory pattern