Pizza maker with Bloch builder
Your main() code feels cumbersome, and the modelling seems unnatural to me.  I also find that .withSize(20).withBacon().withPepperoni() is hard to read, perhaps due to its placement after the definition of the anonymous subclass of Pizza.Builder.


public class Main {
    public static void main(String[] args) throws InterruptedException {
        Factory myFactory = new Factory();

        Pizza myPizza = Pizza.makePizza(new Pizza.Builder(myFactory) {
            @Override
            public void prepareDough() {
                myFactory.prepareDough();
            }

            @Override
            public void prepareToppings() {
                myFactory.prepareToppings();
            }
        }.withSize(20).withBacon().withPepperoni());

        System.out.println(myPizza);
    }
}



Assuming that you are interested in constructing an immutable Pizza, I would prefer to see:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Pizza myPizza = new PizzaBase(20).addTopping(Pizza.Topping.BACON)
                                         .addTopping(Pizza.Topping.PEPPERONI)
                                         .bake();
        System.out.println(myPizza);
    }
}


In particular:


This interface mimics the process of making a pizza.
The base is mandatory, and you must specify its size.  The toppings are optional.
Offering an .addTopping(…) method that accepts a parameter is more flexible.  You might even be able to .addTopping(CHEESE) twice to get extra cheese.
I'm not convinced that dependency injection for the Factory is worthwhile.