refactory BuilderPattern