본문 바로가기
CS/GoF Design Pattern

메멘토 (Memento) 패턴

by 깐니 2022. 5. 22.

정의 ? 

캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법.

백기선 GoF 강의 참고 이미지

 

Originator : 원래의 데이터를 가진 객체.

CareTaker : Originator의 내부정보를 Memento라는 타입으로 가지고 와서 저장하고 있음.

Memento : Originator 객체의 추상화 객체.

따라서 Originator는 두 가지의 operation을 제공해야함.

  • createMemento() : 내부정보를 Memento 클래스로 추상화해서 전달함.
  • restore(Memento) : 외부에서 전달받은 Memento 정보로 자신의 정보를 복원함.

또한, Memento 는 변경불가능한 객체로 구성하여 Originator의 정보를 CareTaker에 전달함.

 

 

예제

/* Memento.class
* 객체의 값이 변경되지 않아야함.
* 방법1. -> final 변수로 선언 : 값이 변경되는 걸 방지하고, 상속을 막음.
* 방법2. -> 생성자를 통해서만 값이 생성될 수 있도록하고, Getter만 제공함.
*/

public class GameSave {
	private final int blueTeamScore;
	private final int redTeamScore;

	public void GameSave(int blueTeamScore, int redTeamScore){
		this.blueTeamScore = blueTeamScore;
		this.redTeamScore = redTeamScore;
	}

	public int getBlueTeamScore(){
		return blueTeamScore;
	}

	public int getRedTeamScore(){
		return redTeamScore;
	}
} 	
/* Originator.class
* 1. Memento.class를 이용하여 값을 저장하는 클래스와
*    Memento.class를 이용하여 값을 복원할 수 있는 클래스를 제공해야함.
*/

public class Game {
	private int redTeamScore;
	private int blueTeamScore;

	public getRedTeamScore() { return redTeamScore; }

	public setRedTeamScore(int redTeamScore) { this.redTeamScore = redTeamScore; }

	public getBlueTeamScore() { return blueTeamScore; }

	public setBlueTeamScore(int blueTeamScore) { this.blueTeamScore = blueTeamScore; }

	public GameSave save(){
		return new GameSave(this.blueTeamScore, this.redTeamScore);
	}

	public void restore(GameSave gameSave){
		this.blueTeamScore = gameSave.blueTeamScore;
		this.redTeamScore = gameSave.redTeamScore;
	}
}
public class Client {
	
	public static void main(String[] args){
		Game game = new Game();
		game.setBlueTeamScore(10);
		game.setRedTeamScore(20);

		// 값 저장 -- 시점1
		GameSave save = game.save();
		
		System.out.println(game.getBlueTeamScore()); // 10
		System.out.println(game.getRedTeamScore());	 // 20

		// Originator의 값이 변경됨.
		game.setBlueTeamScore(12);
		game.setBlueTeamScore(22);
	
		// 값 복원 -- 시점1
		game.store(save);

		System.out.println(game.getBlueTeamScore()); // 10
		System.out.println(game.getRedTeamScore());	 // 20
	}
}

 

메멘토 패턴 장/단점

  • 장점
    1. 단일책임의 원칙을 지킬 수 있음.
  • 단점
    1. 메모리의 사용량이 증가함에 따라, 일정량의 Memento 만 유지하기 위해, CareTaker 클래스에서 메모리를 정리하는 역할을 해야할 수 있음.

'CS > GoF Design Pattern' 카테고리의 다른 글

프로토타입 (Prototype) 패턴  (0) 2022.05.22
싱글톤 (Singleton) 패턴  (0) 2022.05.22