When overused these kind of "patterns" always lead to slow and hard to grasp code that is a nightmare to maintain.

My experience is that they are best discovered independently as a way to abstract code, and let them come naturally to solve a problem. So for most things in Dev, if you do something prematurely you might end up with a good solution for a non existing problem.

Or, even more likely, a bad solution for a non-existent problem.

Like many things they shine when use appropriately.