PDHBE / study

기술 서적 Study
0 stars 0 forks source link

[GoF 디자인패턴] 프로토타입(Prototype) 패턴 #9

Open leeyuunsung opened 3 years ago

leeyuunsung commented 3 years ago

프로토타입 패턴 1부 - 패턴 소개

스크린샷 2021-11-08 오후 10 01 10
public class App {

    public static void main(String[] args) {
        GithubRepository repository = new GithubRepository();
        repository.setUser("whiteship");
        repository.setName("live-study");

        GithubIssue githubIssue = new GithubIssue(repository);
        githubIssue.setId(1);
        githubIssue.setTitle("1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.");

        String url1 = githubIssue.getUrl();

        GithubIssue clone = githubIssue.clone();

        // TODO : (clone != githubIssue) == true    -> (Reference Check, 둘의 Reference 는 같지 않음)
        // TODO : clone.equals(githubIssue) == true -> (값을 비교하는 것 이기 때문에 둘의 값은 같음)
    }

}

프로토타입 패턴 2부 - 패턴 적용하기

public class GithubIssue implements Cloneable {

    private int id;
    private String title;
    ...

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone;
    }

주의사항

System.out.println(clone.getRepository() == githubIssue.getRepository()); // True
@Override
protected Object clone() {
    GithubRepository repository = new GithubRepository();
    repository.setUser(this.repository.getUser());
    repository.setName(this.repository.getName());
    GithubIssue githubIssue = new GithubIssue(repository);
    githubIssue.setId(this.id);
    githubIssue.setTitle(this.title);
    return githubIssue;
}
leeyuunsung commented 3 years ago

프로토타입 패턴 3부 - 장점과 단점

장점

단점

프로토타입 패턴 4부 - 자바와 스프링에서 찾아보는 패턴

Java Collection 의 clone()

public static void main(String[] args) {
    ...
    ArrayList<Student> students = new ArrayList<>();
    ...
    ArrayList<Student> clone = students.clone();
}
public static void main(String[] args) {
    ...
    List<Student> students = new ArrayList<>();
    ...
    List<Student> clone = new ArrayList<>(students);
}

ModelMapper

public static void main(String[] args) {
    GithubRepository repository = new GithubRepository();
    repository.setUser("whiteship");
    repository.setName("live-study");
    GithubIssue githubIssue = new GithubIssue(repository);
    githubIssue.setId(1);
    githubIssue.setTitle("1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.");
    ModelMapper modelMapper = new ModelMapper();
    GithubIssueData githubIssueData = modelMapper.map(githubIssue, GithubIssueData.class);
     ...
}