design pattern in C++