Elements of Reusable Object-Oriented Software created by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.