abstract factory and builder