Well, an abstract factory could work too, of course :). Slower but work too.