Apply Factory Method pattern
Apply State pattern