To answer your question in terms of reducing 'if-else' usage, you could dynamically determine the class to use e.g. instead of
if (PType.equals("Cheese")) {
p=new CheesePizza();
you could use
Class.forName(PType + "Pizza").newInstance(); // might need a package
(the above assumes a no-args constructor)
and that would remove any switching-type behaviour.
However I wouldn't recommend this. The above is difficult to debug and non-obvious. Your IDE will likely mark such classes as not being used and a possible candidate for removal during a future refactor. I would favour clarity in the vast majority of cases.
In short, I would much rather specify the specifications of available pizzas via an if/else sequence, a String-based switch, a map of strings to method objects etc. rather than any convoluted, non-obvious, perhaps fragile mechanism.