-
[GoF] 프로토타입 패턴, Prototype patternGof Design Pattern 2021. 9. 3. 15:20
프로토타입 패턴, Prototype pattern
프로토타입 패턴이란?
생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제하는 패턴을 말한다.
프로토타입 패턴 왜 사용할까?
정의한 클래스의 인스턴스 생성과정이 복잡하거나 여러 조합에 의해 생성이 되어야하는 경우가 있습니다.
예를 들어, 객체를 생성해서 DB로부터 데이터를 가져와야하는 경우가 있습니다. 그렇다면 매번 객체를 생성할때마다 DB 트랜잭션이 발생하게 되는데 이는 꽤나 많은 비용을 소모하는 행위입니다.
이 때 하나의 프로토타입을 만들어 초기화해두고 이를 복제해서 사용 및 수정하면 비용을 많이 아낄 수 있습니다.
프로토타입 패턴 을 사용하게 되면
- 프로토타입 속성값을 활용한 객체 생성을 할 수 있다.
- 서브클래스의 수를 줄일 수 있다.
- java에서는 clone 메스드를 override하여 구현한다.
클래스 다이어그램
객체 협력
- Object 클래스의 clone 메서드를 재정의한다.
- clone 메서드를 사용하기 위해 Clonable 인터페이스를 implement 한다.
코드보기 Click!
public class Song { private String singer; private String title; //생성자 public Song(String singer, String title) { this.singer = singer; this.title = title; } /* getter, setter */ public String getSinger() { return singer; } public void setSinger(String singer) { this.singer = singer; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String toString() { return title + "<" + singer + ">"; } }
import java.util.ArrayList; public class Album implements Cloneable{ private ArrayList<Song> album; public Album(){ album = new ArrayList<Song>(); } public ArrayList<Song> getAlbum() { return album; } public void setAlbum(ArrayList<Song> album) { this.album = album; } public void addAlbum(Song song){ album.add(song); } public String toString(){ return album.toString(); } @Override protected Object clone() throws CloneNotSupportedException { Album cloneAlbum = new Album(); for (Song song: album) { cloneAlbum.addAlbum(song); } return cloneAlbum; } }
public class TestPrototype { public static void main(String[] args) throws CloneNotSupportedException { Album album = new Album(); album.addAlbum(new Song("BTS", "dynamite")); album.addAlbum(new Song("aespa", "next level")); album.addAlbum(new Song("akmu(whith iu)", "낙하")); System.out.println(album.toString()); Album album2 = (Album)album.clone(); album2.addAlbum(new Song("이무진", "신호등")); System.out.println("===== 앨범 깊은 복사 후 ====="); System.out.println(album.toString()); System.out.println(album2.toString()); } }
'Gof Design Pattern' 카테고리의 다른 글
[GoF] 팩토리 메서드 패턴(Factory Method Pattern) (0) 2021.12.05 [ GoF] 템플릿 메서드 패턴(Template Method Pattern) (0) 2021.12.04 [GoF] 빌더 패턴(Builder Pattern) (0) 2021.12.03 [GoF] 추상 팩토리 , Abstract Factory (0) 2021.09.06 [GoF] 싱글톤 패턴, Singleton pattern (0) 2021.09.02