templete pattern