abstract factory description