Proxy
O design pattern proxy estabelece uma estratégia de criar um objeto Proxy que possa trabalhar como um mediador entre um objeto Client e um terceiro objeto Subject.
Através do pattern Proxy podemos simular o uso de um objeto Subject pelo Client sem efetivamente instanciá-lo ou fazê-lo operar, tomando tais ações somente quando for necessário.
Imagine uma aplicação onde você pode copiar e colar objetos pesados, por exemplo, imagens. E nessa aplicação o uso normal é ter v´rias cópias das imagens e somente algumas dessas cópias sofrem alterações.
Poderíamos utilizar o design pattern proxy para poupar processamento e memória da seguinte maneira: utilizar uma interface Image, que seria implementada pelo objeto concreto ImageProxy. O ImageProxy poderia guardar uma referência a um único objeto ImageImpl (o ImageImpl no exemplo faz o papel de Subject), ainda que vários ImageProxy estivessem instanciados; para a aplicação existiriam vários Images ainda que na realidade apenas um ImageImpl estivesse instanciado.

Quando a aplicação fosse realizar uma alteração em um dos Images disponíveis, só então, o ImageProxy criaria uma nova instância de um ImageImpl, reapontaria a sua referência e realizaria a alteração no ImageImpl.
Com essa abordagem conseguimos otimizar o uso de memória e até mesmo de processamento, caso o objeto a ser copiado seja muito grande.

Outras situações podem se valer do design pattern Proxy para controle de acesso (o proxy pode ser utilizado para determinar se uma parte da aplicação pode ou não acessar um objeto ou realizar uma determinada operação) ou mesmo caching de informações.