Design patterns that cost us more than they saved, and when each one pays off
Four patterns we removed from real code: a singleton holding hidden state, an abstract factory with one product, an observer that leaked memory, and a strategy hierarchy for two if statements. What each cost us, and the signals that tell you a pattern is worth it.