Make class immutable
Refactor code, replace clone() methods with copy constructors and generic factories