An example of Abstract Factory design pattern