Adding abstract factory patterns