Explain common software design patterns simply