Архитектура системРазработчик PoC/Архитектор

В чём принципиальная разница между паттернами Proxy и Facade на уровне архитектуры, и когда их применять?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Proxy и Facade — это структурные паттерны проектирования, которые решают различные задачи при организации архитектуры приложений.

Proxy выступает суррогатом или «заместителем» объекта. Его задача — контролировать доступ, кэшировать, реализовывать ленивую загрузку, регулировать безопасность или распределять запросы (например, сетевой прокси, security proxy). Proxy реализует тот же контракт (интерфейс), что и реальный объект.

Пример на Java:

public interface Service { void operation(); } public class RealService implements Service { public void operation() { // ... } } public class ProxyService implements Service { private RealService realService = new RealService(); public void operation() { // access check realService.operation(); } }

Facade — это паттерн, который скрывает сложность подсистемы, предоставляя единый упрощённый интерфейс. Facade не занимается контролем доступа или дополняющей логикой, он только агрегирует вызовы.

Пример на Java:

public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } }

Когда применять:

  • Proxy — если требуется контролировать доступ, кэш, логику безопасности, lazy loading
  • Facade — когда необходимо упростить работу клиента с набором подсистем и снизить связанность
  • Они могут дополнять друг друга, но задачи разные

Ключевые особенности:

  • Proxy реализует интерфейс цели, Facade — свой
  • Proxy прозрачен для клиента, Facade — дополнительная абстракция
  • Proxy добавляет поведение, Facade только упрощает работу

Вопросы с подвохом.

Разрешается ли Facade паттерн добавлять функциональность сверх исходных классов подсистемы?

Нет, Facade только агрегирует и упрощает вызовы, новый функционал реализуется другими паттернами либо в новых сервисах.

Обязательно ли Proxy реализовывать через наследование от целевого объекта?

Нет, Proxy реализует интерфейс цели, но часто используется композиция (инкапсуляция настоящего объекта), а не наследование.

Можно ли использовать Facade для управления доступом или лога ошибок?

Для этого лучше использовать Proxy. Facade не предназначен для встроенной поддержки кэширования, логирования или проверки прав.