C++ Twenty-three design patterns