I agree that we need more builders, but IMO those should not be in the LogicalPlanBuilder (my reasoning is that we wouldn't want to keep updating it to reflect every Logical Op and/or logical Op field).
My idea is to create builders inside the logical ops themselves (using a builder hierarchy that follow the op hierarchy).
In the end using them would look approximately like:
StorageEngine engine = HBaseStorageEngine.builder()
LogicalPlan plan = LogicalPlan.builder()
Along with adding builders to ops we would also make them immutable.