design pattern c++