based on design patterens