๐ŸŽฐ Design Pattern

Prototype Pattern | ํ”„๋กœํ† ํƒ€์ž… ํŒจํ„ด

์—ฐ_์šฐ๋ฆฌ 2022. 8. 14. 22:41
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์“ฐ์ผ๊นŒ?

    DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, 

    ๋˜๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฑฐ์ณ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์‹œ๊ฐ„๋„ ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ณ  ๋ฆฌ์†Œ์Šค๋„ ๋งŽ์ด ์†Œ๋ชจํ•˜๊ฒŒ๋œ๋‹ค.

     

    ๊ธฐ์กด์— ์ด๋ฏธ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด 

    ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์‚ฌํ•˜๊ณ , ๊ฐ’๋งŒ ์กฐ๊ธˆ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€ ์•Š์„๊นŒ?!

     

     

     

    ํ”„๋กœํ† ํƒ€์ž… ํŒจํ„ด์ด๋ž€?

    ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ํŒจํ„ด์ด๋‹ค.

    ๊ธฐ์กด์˜ ๊ฐ์ฒด๋ฅผ ์‘์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ํ™œ์šฉํ•œ๋‹ค

     

     

    ์žฅ์ 

    - ๋ณต์žกํ•œ ๊ฐ์ฒด ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

    - ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

     

     

    ๋‹จ์ 

    - ์ˆœํ™˜์ฐธ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ณต์ œ๊ณผ์ • ์ž์ฒด๊ฐ€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

     

    ๊ตฌํ˜„๋ฐฉ๋ฒ•

    ๊ธฐ์กด์ฝ”๋“œ

    GithubRepository repository = new GithubRepository();
    repository.setUser("lotu-us");
    repository.setName("study");
    
    GithubIssue issue = new GithubIssue(repository);
    issue.setId(1);
    issue.setTitle("๋””์ž์ธํŒจํ„ด : ์‹ฑ๊ธ€ํ†ค");
    
    String url = issue.getUrl();
    System.out.println(url); // http://github.com/lotu-us/study/issues/1
    
    
    //์ƒˆ๋กœ์šด URL์„ ๊ฐ€์ ธ์˜ค๊ณ ์žํ•˜๋ฉด ์•„๋ž˜๋ฐฉ๋ฒ•์œผ๋กœ ์ด์Šˆ ์ƒ์„ฑ..?
    GithubIssue issue2 = new GithubIssue(repository);
    issue2.setId(2);
    issue2.setTitle("๋””์ž์ธํŒจํ„ด : ๋นŒ๋”");

    ๊นƒํ—ˆ๋ธŒ ์ด์Šˆ URL์„ ์ƒ์„ฑํ•  ๋•Œ,

    repository์— ์ €์žฅ๋œ User์™€ Name์€ ๋™์ผํ•˜๊ณ  issue์˜ id, title๋งŒ ๋ฐ”๋€”ํ…๋ฐ

     

    ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ๋งŒ๋“ค๋•Œ ๋˜ GithubRepository๋ฅผ ์˜์กดํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผํ• ๊นŒ???

     

     

     

    ๋ณ€๊ฒฝ์ฝ”๋“œ

    ์ž๋ฐ”์˜ Object ๊ฐ์ฒด๋Š” clone๋ฉ”์„œ๋“œ๋ฅผ ์ด๋ฏธ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค!

    Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„๋ฐ›์•„ clone() ๋ฉ”์„œ๋“œ๋ฅผ override๋ฐ›์ž

    public class GithubIssue implements Cloneable {
        ~~~~
        
        @Override
        protected Object clone() throws CloneNotSupportedException {
        	return super.clone();
        }
    }

     

    GithubRepository repository = new GithubRepository();
    repository.setUser("lotu-us");
    repository.setName("study");
    
    GithubIssue issue = new GithubIssue(repository);
    issue.setId(1);
    issue.setTitle("๋””์ž์ธํŒจํ„ด : ์‹ฑ๊ธ€ํ†ค");
    
    String url = issue.getUrl();
    System.out.println(url); // http://github.com/lotu-us/study/issues/1
    
    
    GithubIssue cloneIssue = null;
    try{
    	cloneIssue = (GithubIssue) issue.clone();
    }catch(CloneNotSupportedException){
    	e.printStackTrace();
    }
    
    System.out.println(cloneIssue.getUrl());   // http://github.com/lotu-us/study/issues/1

     

     

     

    ๋ฐ˜์‘ํ˜•

    ์ฃผ์˜ํ•  ์ !

    == ๊ณผ equals

    GithubIssue issue = new GithubIssue(repository);
    
    GithubIssue cloneIssue = issue.clone();


    ๐Ÿ”ฅ cloneIssue != issue  => true
    == ์€ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
    clone๋ฉ”์„œ๋“œ๋กœ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ ๊ฒƒ์ด๊ธฐ์— ์„œ๋กœ์˜ ์ฃผ์†Œ๊ฐ’ ๋‹ค๋ฅด๋‹ค

    ๐Ÿ”ฅ cloneIssue.equals(issue)  => true
    equals ๋Š” ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
    clone๋ฉ”์„œ๋“œ๋กœ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์–ด๋„ ์„œ๋กœ์˜ ๊ฐ’์ด ๊ฐ™๊ธฐ๋•Œ๋ฌธ์— true์ด๋‹ค.

     

     

     

     

     

    shallow copy(์–•์€ ๋ณต์‚ฌ) vs deep copy(๊นŠ์€ ๋ณต์‚ฌ) 

    GithubRepository repository = new GithubRepository();
    repository.setUser("lotu-us");
    
    GithubIssue issue = new GithubIssue(repository);
    issue.setId(1);
    System.out.println(issue.getUrl()); 
    // http://github.com/lotu-us/study/issues/1
    
    GithubIssue cloneIssue = (GithubIssue) issue.clone();
    
    //cloneํ•œ ํ›„ ์„œ๋กœ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋˜ repository์˜ user๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด?!
    repository.setUser("GumiBear");
    
    System.out.println( cloneIssue.getRepository() == issue.getRepository() ); 
    //๐Ÿ”ฅtrue
    //clone๊ณผ issue๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” repository๋Š” ์„œ๋กœ ๊ฐ™๋‹ค
    
    System.out.println(cloneIssue.getUrl());
    // http://github.com/GumiBear/study/issues/1

    ์ž๋ฐ” Object๊ฐ์ฒด์˜ clone()์€ ์–•์€ ๋ณต์‚ฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

    ๋”ฐ๋ผ์„œ ์ค‘๊ฐ„์— ์„œ๋กœ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” repository์˜ ๊ฐ’์„ ๋ฐ”๋€Œ๋ฉด ์›๋ณธ๊ณผ ํด๋ก  ๋ชจ๋‘์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค!

     

     

     

    deep copy๋ฅผ ํ•˜๋ ค๋ฉด @Overrideํ•œ clone๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ฉด๋œ๋‹ค.

    public class GithubIssue implements Cloneable {
        ~~~~
        
        @Override
        protected Object clone() throws CloneNotSupportedException {
        	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;
        }
    }

     

     

    ์—ฌ๊ธฐ์„œ ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ค‘๊ฐ„์— repository์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์›๋ณธ์—๋Š” ์ ์šฉ๋˜๊ฒ ์ง€๋งŒ ํด๋ก ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

    repository.setUser("lotu-us");
    
    System.out.println(issue.getUrl());
    // http://github.com/lotu-us/study/issues/1
    
    repository.setUser("GumiBear");
    
    System.out.println( cloneIssue.getRepository() == issue.getRepository() ); 
    //๐Ÿ”ฅfalse
    //clone๊ณผ issue๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” repository๊ฐ€ ๋‹ค๋ฅด๋‹ค
    
    
    System.out.println(issue.getUrl());
    //์›๋ณธ : http://github.com/GumiBear/study/issues/1
    
    System.out.println(cloneIssue.getUrl());
    //ํด๋ก  : http://github.com/lotu-us/study/issues/1

     

     

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ