I think a lot of "patterns" in programs are introduced to avoid thinking about naming. Global scope is perhaps bad, but worse is arbitrarily creating new abstractions. Throwing a decorator pattern, throwing in a message bus, throwing in service objects. It looks really well structured, proper CS-engineering, until you open up the cabinet and see all these drawers with random stuff inside of them.