builder as abstract factory