반응형
목차
어떤 상황에서 쓰일까?
애플리케이션 내에서 A라는 객체를 만드는데에 10초가 걸린다고하자.
A 객체를 만들어야만 애플리케이션이 동작하는데
A 객체의 값이 필요한 상황은 아니라고하자. 즉 A의 깡통만 있으면 된다는 얘기이다!
뒤에 할일이 너무 많아도 10초를 기다려서 A객체가 만들어지기를 기다리는게 나은 선택일까?
차라리 A객체의 값이 실제로 필요할 때 A를 만들고 그 전에는 깡통인 채로 놔두면 어떨까?
프록시 패턴이란?
특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴
초기화 지연, 접근제어, 캐싱 등 다양하게 응용할 수 있다!
프록시의 활용
- 초기화 지연
리소스가 많이 사용되는 객체인 경우, 해당 객체 타입의 프록시를 만든 후
실제 객체가 필요한 순간에 프록시가 실제 객체를 바라보게 해서 초기화를 최대한 늦춘다
- 접근제어
어떤 객체는 특정 권한이 있어야만 접근이 가능할 때, 중간에 프록시를 두고
프록시에서 권한을 체크한 후 실제 객체에 접근하게한다
- 캐싱
객체에 접근할 때, 이미 여러번 접근했던 객체라면 굳이 실제 객체까지 가지 않아도 되지 않을까?
프록시에서 객체의 값을 저장해두었다가 빠르게 값을 반환해주어 캐싱처리한다
등등...
장점
- 기존 코드를 변경하지 않고 프록시를 통해 새로운 기능을 추가할 수 있다
- 기존 코드가 해야하는 일만 유지할 수 있다.
단점
- 코드의 복잡도 증가
구현코드
기존코드
public class GameService {
public void startGame() {
System.out.println("이 자리에 오신 여러분을 진심으로 환영합니다.");
}
}
---------------------------------------------------------------------------
public class Client {
public static void main(String[] args) throws InterruptedException {
GameService gameService = new GameService();
gameService.startGame();
}
}
변경코드
public interface GameService {
void startGame();
}
---------------------------------------------------------------
public class DefaultGameService implements GameService {
@Override
public void startGame() {
System.out.println("이 자리에 오신 여러분을 진심으로 환영합니다.");
}
}
---------------------------------------------------------------
public class GameServiceProxy implements GameService {
private GameService gameService; //실제 객체가 필요할 때 호출해야하니 참조한다
@Override
public void startGame() {
//초기화 지연
if (this.gameService == null) {
this.gameService = new DefaultGameService();
}
gameService.startGame();
}
}
public class Client {
public static void main(String[] args) {
GameService gameService = new GameServiceProxy();
gameService.startGame();
}
}
반응형
'Computer Science' 카테고리의 다른 글
Flyweight Pattern | 플라이웨이트 패턴 (0) | 2022.08.16 |
---|---|
Facade Pattern | 퍼사드 패턴 (0) | 2022.08.16 |
Decorator Pattern | 데코레이터 패턴 (0) | 2022.08.16 |
Composite Pattern | 컴포짓 패턴 (0) | 2022.08.15 |
Bridge Pattern | 브릿지 패턴 (0) | 2022.08.15 |